从 ICollection 中获取价值的最佳方法是什么?除此之外,我们知道 Collection 是空的。
Udo Weber
问问题
108356 次
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 回答