60

从 ICollection 中获取价值的最佳方法是什么?除此之外,我们知道 Collection 是空的。

4

5 回答 5

90

您可以为此使用 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();
于 2008-12-12T17:18:13.420 回答
25

最简单的方法是:

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;
}

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

于 2008-12-12T16:55:11.267 回答
9
collection.ToArray()[i]

这种方式很慢,但使用起来非常简单。

于 2014-02-10T22:16:58.360 回答
5

没有泛型并且因为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());
于 2008-12-12T17:06:57.013 回答
-1

如果您知道您的收藏只有一项,应该只有一项,您可以使用 Linq 扩展方法Single()

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

于 2018-04-01T09:42:53.647 回答