ICollection - 获取单个值

时间:2008-12-12 16:42:36

标签: c# .net icollection

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

6 个答案:

答案 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()相比,它提供了更好的正确性保证。