C#ICollection获得单个值

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

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(); 

最简单的方法是:

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

但是,如果它实际上是一个generics集合,那么效率并不是很高,因为IEnumerator实现了IDisposable,因此编译器必须在finally块中放置一个Dispose()调用。

如果它是非generics集合,或者您知道generics集合在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; } 

同样,如果它可能是你自己定义的某种types的索引访问,你可以使用相同的技术。

没有generics,因为ICollection实现了IEnumerable ,所以你可以像例1那样做。你可以简单地使用generics,就像例子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()); 

 collection.ToArray()[i] 

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