ICollection - 获取单个值

发布于 2024-07-10 09:39:08 字数 52 浏览 8 评论 0原文

从 ICollection 获取值的最佳方式是什么? 除此之外,我们知道该集合是空的。

What is the best way to get a value from a ICollection?
We know the Collection is empty apart from that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

思念满溢 2024-07-17 09:39:08

您可以使用 LINQ 来实现此目的:

var foo = myICollection.OfType<YourType>().FirstOrDefault();
// or use a query
var bar = (from x in myICollection.OfType<YourType>() where x.SomeProperty == someValue select x)
   .FirstOrDefault();

You can use LINQ for this:.

var foo = myICollection.OfType<YourType>().FirstOrDefault();
// or use a query
var bar = (from x in myICollection.OfType<YourType>() where x.SomeProperty == someValue select x)
   .FirstOrDefault();
心清如水 2024-07-17 09:39:08

最简单的方法是:

foreach(object o in collection) {
  return o;
}

但如果它实际上是一个泛型集合,则效率不是特别高,因为 IEnumerator 实现了 IDisposable,因此编译器必须放入 try/finally,并在 finally 块中调用 Dispose()。

如果它是非泛型集合,或者您知道泛型集合在其 Dispose() 方法中未实现任何内容,则可以使用以下内容:

IEnumerator en = collection.GetEnumerator();
en.MoveNext();
return en.Current;

如果您知道是否可以实现 IList,则可以执行以下操作:

IList iList = collection as IList;
if (iList != null) {
  // Implements IList, so can use indexer
  return iList[0];
}
// Use the slower way
foreach (object o in collection) {
  return o;
}

同样,如果可能会实现将是您自己定义的某种类型,具有某种索引访问,您可以使用相同的技术。

The simplest way to do this is:

foreach(object o in collection) {
  return o;
}

But this isn't particularly efficient if it's actually a generic collection because IEnumerator implements IDisposable, so the compiler has to put in a try/finally, with a Dispose() call in the finally block.

If it's a non-generic collection, or you know the generic collection implements nothing in its Dispose() method, then the following can be used:

IEnumerator en = collection.GetEnumerator();
en.MoveNext();
return en.Current;

If you know if may implement IList, you can do this:

IList iList = collection as IList;
if (iList != null) {
  // Implements IList, so can use indexer
  return iList[0];
}
// Use the slower way
foreach (object o in collection) {
  return o;
}

Likewise, if it's likely it'll be of a certain type of your own definition that has some kind of indexed access, you can use the same technique.

情未る 2024-07-17 09:39:08
collection.ToArray()[i]

这种方式速度慢,但是使用起来很简单。

collection.ToArray()[i]

This way is slow, but very simple to use.

灼疼热情 2024-07-17 09:39:08

如果没有泛型,并且由于 ICollection 实现了 IEnumerable,您可以像示例 1 中那样执行操作。使用泛型时,您只需像示例 2 中那样执行操作:

List<string> l = new List<string>();
l.Add("astring");

ICollection col1 = (ICollection)l;
ICollection<string> col2 = (ICollection<string>)l;

//example 1
IEnumerator e1 = col1.GetEnumerator();
if (e1.MoveNext())
    Console.WriteLine(e1.Current);

//example 2
if (col2.Count != 0)
    Console.WriteLine(col2.Single());

Without generics and because ICollection implements IEnumerable you can do like in example 1. With generics you simple need to do like example 2:

List<string> l = new List<string>();
l.Add("astring");

ICollection col1 = (ICollection)l;
ICollection<string> col2 = (ICollection<string>)l;

//example 1
IEnumerator e1 = col1.GetEnumerator();
if (e1.MoveNext())
    Console.WriteLine(e1.Current);

//example 2
if (col2.Count != 0)
    Console.WriteLine(col2.Single());
水晶透心 2024-07-17 09:39:08

如果您知道您的集合只有一项,并且应该只有一项,则可以使用 Linq 扩展方法 Single()

这会将 ICollection 转换为包含该集合的单个项目的 T 对象。 如果集合的长度为 0 或大于 1,则会抛出 InvalidOperationException

If you know your collection has only one item, should only ever have one item, you can use the Linq extension method Single().

This converts a ICollection<T> into a T object containing the single item of that collection. If the length of the collection is 0, or more than one, this will throw an InvalidOperationException.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文