web-dev-qa-db-ja.com

ICollection-単一の値を取得

ICollectionから値を取得する最良の方法は何ですか?コレクションはそれ以外は空です。

47
Udo Weber

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();
72
Will

これを行う最も簡単な方法は次のとおりです。

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;
}

同様に、何らかのインデックス付きアクセスを持つ独自の定義の特定のタイプである可能性が高い場合は、同じ手法を使用できます。

20
Chris

ジェネリックなしで、ICollectionIEnumerableを実装するため、例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
bruno conde

collection.ToArray()[i]

この方法は遅いが、非常に使いやすい

2
mehrdad seyrafi

コレクションにアイテムが1つしかないことがわかっている場合、アイテムが1つしかない場合は、Linq拡張メソッド Single() を使用できます。

これにより、ICollection<T>をそのコレクションの単一のアイテムを含むTオブジェクトに入れます。コレクションの長さが0または複数の場合、InvalidOperationExceptionがスローされます。

0
JAD