【发布时间】:2010-09-26 16:09:30
【问题描述】:
从 ICollection 中获取值的最佳方法是什么? 除此之外,我们知道 Collection 是空的。
【问题讨论】:
标签: c# .net icollection
从 ICollection 中获取值的最佳方法是什么? 除此之外,我们知道 Collection 是空的。
【问题讨论】:
标签: c# .net icollection
最简单的方法是:
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;
}
同样,如果它可能是您自己定义的某种类型的具有某种索引访问的,您可以使用相同的技术。
【讨论】:
没有泛型,因为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());
【讨论】:
您可以为此使用 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();
【讨论】:
using System.Linq;
collection.ToArray()[i]
这种方式速度慢,但使用起来非常简单。
【讨论】:
如果你知道你的收藏只有一项,应该只有一项,你可以使用 Linq 扩展方法Single()。
这会将ICollection<T> 转换为包含该集合的单个项目的T 对象。如果集合的长度为 0 或大于 1,则会抛出 InvalidOperationException。
【讨论】: