从ICollection获取值的最佳方法是什么? 我们知道Collection除此之外是空的。
答案 0 :(得分:70)
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();
答案 1 :(得分:19)
最简单的方法是:
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;
}
同样,如果它可能属于某种类型的您自己的定义,并且具有某种索引访问权限,则可以使用相同的技术。
答案 2 :(得分:3)
没有泛型,并且因为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());
答案 3 :(得分:2)
collection.ToArray()[i]
这种方式很慢,但使用起来非常简单
答案 4 :(得分:0)
如果你知道你的收藏品只有一个项目,那么只能有一个项目,你可以使用Linq扩展方法Single()
。
这将ICollection<T>
转换为包含该集合的单个项目的T
对象。如果集合的长度为0或多于1,则会抛出InvalidOperationException
。
答案 5 :(得分:-1)
using System.Linq;
collection.Single();
我个人更喜欢此方法从类型为ICollection<T>
的单例变为T
。它与FirstOrDefault()
一样简单,但是如果集合没有单个元素,则会抛出Single()
。因此,与使用FirstOrDefault()
相比,它提供了更好的正确性保证。