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;
}
しかし、IEnumeratorがIDisposableを実装しているため、実際にジェネリックコレクションである場合、これは特に効率的ではありません。したがって、コンパイラは、finallyブロックでDispose()呼び出しを使用してtry/finallyを実行する必要があります.
非ジェネリックコレクションである場合、またはジェネリックコレクションが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());
。
collection.ToArray()[i]
この方法は遅いが、非常に使いやすい
コレクションにアイテムが1つしかないことがわかっている場合、アイテムが1つしかない場合は、Linq拡張メソッド Single()
を使用できます。
これにより、ICollection<T>
をそのコレクションの単一のアイテムを含むT
オブジェクトに入れます。コレクションの長さが0または複数の場合、InvalidOperationException
がスローされます。