コレクション (collection)

コレクションとは、配列を補足するデータ構造です。

System.Collections名前空間

コレクションに関する型は、System.Collections名前空間で宣言されています。

名前空間  
System.Collections.ObjectModel 再利用可能なライブラリのオブジェクト モデルでコレクションとして使用できるクラスが含まれる。

これらのクラスは、プロパティまたはメソッドがコレクションを返す場合に使用する。

System.Collections.Generic ジェネリック コレクションを定義するインターフェイスとクラスが含まれる。

このコレクションを使用することにより、ユーザーは、汎用的ではない厳密に型指定されたコレクションに比べてタイプ セーフでパフォーマンスが高い、厳密に型指定されたコレクションを作成できるようになる。

System.Collections.Specialized 特殊な厳密に型指定されたコレクションが含まれる。

たとえば、リンクされたリスト ディクショナリ、ビット ベクター、文字列だけを含むコレクションなどがある。

System.Collections.Concurrent スレッド セーフなコレクション クラスが含まれる。

複数のスレッドがコレクションに同時にアクセスするときに、これらのコレクション クラスを名前空間および名前空間の対応する型の代わりに使用する必要がある。ただし、拡張メソッドや明示的なインターフェイスの実装を介したコレクション オブジェクトの要素へのアクセスは、スレッドセーフであるという保証はなく、呼び出し元による同期が必要になる場合がある。

.NET API ブラウザー | Microsoft Docs

コレクション インターフェイス (Collection interface)

以下のインターフェイスで、コレクションの列挙、データの格納や作成のための標準的な方法が提供されます。

インターフェイス 実装 機能
IEnumerable
IEnumerable インターフェイス (System.Collections) | Microsoft Docs
  単純な反復処理を支援する列挙子を提供
ICollection
ICollection インターフェイス (System.Collections) | Microsoft Docs
IEnumerable サイズと列挙子、それに同期オブジェクトの提供
IList ICollection  
IDictionary ICollection  
IEnumerator
IEnumerator インターフェイス (System.Collections) | Microsoft Docs
  単純な反復処理の支援
IDictionaryEnumerator IEnumerator  
     
インターフェイス - System.Collections 名前空間 | Microsoft Docs

コレクション クラス (Collection Class)

これらはジェネリックではない古いクラスであるため、型の安全性とパフォーマンスを考えるならば、新しいジェネリックなコレクション クラスを使用すべきです。

反復子 (Iterators)

yieldキーワード

反復子を定義できます。

yield return expression;
yield break;

foreachステートメント

int[] p = { 1, 2, 3 };
foreach (int x in p)
{
    Console.Write(x);
}

foreachで処理しているコレクションは、そのブロック内で項目の追加や削除はできません。foreach (Visual Basic では For Each) ブロック内のステートメントによって、反復処理中のコレクションが変更される - 例外のトラブルシューティング : System.InvalidOperationException | Microsoft Docs

List<int> list = new List<int>(new int[] { 1, 2, 3 });
foreach (int item in list) // 2回目のループで、System.InvalidOperationException
{                          // 「コレクションが変更されました。列挙操作は実行されない可能性があります。」
    list.Remove(item);
}

スレッド セーフ

Concurrentで定義されているクラスが要件を満たすならば、それを用います。

ICollectionインターフェイスを実装するならば、それのSyncRootプロパティを同期用のオブジェクトとして用います。

ICollection iCollection = collection;
lock (iCollection.SyncRoot)
{
}
注釈 - ICollection.SyncRoot プロパティ (System.Collections) | Microsoft Docs

ICollectionを実装するが、そのクラスのプロパティとしてSyncRootを実装していないクラスでは、ICollectionへキャストした上で取得します。c# - List<T> doesn't implements SyncRoot! - Stack Overflow

List<int> list = new List<int>();
object obj = ((ICollection)list).SyncRoot;

なおArrayListのような非ジェネリック クラスで定義されていた、スレッド セーフなコレクションを返すSynchronized()は、ジェネリック版では廃止されています。

参考

参考書

MSDN (Microsoft Developer Network) から検索