C#のコレクションまとめ

C#でリストや配列などコレクションの処理をするのは何かと多いです。
C#のバージョンが、1.0から2.0, 3.0, 4.0と上がっていくたびに、
コレクションのライブラリもより便利で使いやすいクラスが増えてきました。

クラスが非常に多く、どこに何があるのか分かりにくかったのでまとめてました。

コレクション継承図

C#のコレクションとして、上の図のようなクラス(やインターフェイス)があります。

System.Collections名前空間

System.Collections名前空間以下のクラスは、C#1.0に作られたコレクションライブラリです。
基本的にこれらのクラスは、古く扱いづらいので使わないほうが良いと思います。
次に説明するSystem.Collections.Generic名前空間を使用してください。
ただし、昔のライブラリによっては、このSystem.Colelctionを使用している場合があるので、覚えておいて損はないと思います。

System.Collections.Generic名前空間

System.Collections.Generic名前空間以下のクラスは、C#2.0に作られたコレクションライブラリです。
C#でコレクションを扱う場合、基本この名前空間をusingします。

System.Collections.Generic以下のクラス

IEnumerable<T>インターフェイス

ここからはSystem.Collections.Generic名前空間以下のクラスについて説明します。
C#のコレクション、リストや配列などはすべて、IEnumerableインターフェイスを継承しています。
なので、リストであろうが配列であろうが、IEnumerable型として使用することが出来ます。

IEnumerable<int> xs = new List<int>{1,2,3,4};
IEnumerable<int> ys = new int[]{1,2,3,4};
IEnumerable<int> zs = new HashSet<int>{1,2,3,4};
IList<T>インターフェイス

リストです。可変長な配列として扱うことができ、追加や削除が可能です。

IList<int> xs = new List<int>{0,1,2,3};
xs.Add(4);
xs.Add(5);

上の例ではxsの中身は{0,1,2,3,4,5}になります。

ISet<T>インターフェイス

C#4.0から追加されたインターフェイスです。
要素がひとつだけのコレクションです。同じ要素は二個以上入りません。

ISet<int> xs = new HashSet<int>{1,2,3,4};
xs.Add(5);//追加
xs.Add(4);//同じ要素がある場合追加されない

上の例では、xsの中身は{1,2,3,4,5}になります。

IDictionary<TKey,TValue>インターフェイス

TKeyがキー、TValueが値な辞書コレクションです。

IDictionary<String,String> map = new Dictionary<String,String>();
map["google"] = @"http://www.google.com/";
map["yahoo"] = @"http://www.yahoo.co.jp/";
map["hatena"] = @"http://www.hatena.ne.jp/"
map["mindfree"] = @"http://mindfree.jp/";
String str = map["hatena"];
Console.WriteLine(str);// "http://www.hatena.ne.jp/"

ジェネリック

IListに付いているTというものが付いていますが、これは型パラメータと言われるのもです。
IListのTは要素の型を表しています。
例えばIListならば要素がのintリストですし、IListでは要素がStringのリストになります。
Tなど、型パラメータをもつのもをジェネリックスと呼びます。

System.Linq.Enumerableクラス

C#3.5からSystem.Linq.EnumerableクラスというIEnumerableに対して便利な拡張メソッドを提供しているクラスが追加されました。
使用する場合はSystem.Linq名前空間をusingします。
Enumerableクラスを使用すればSelect()やWhere()などを利用することが出来ます。


他にも、図に載せきれていない便利なクラスがたくさんあるので、System.Collections.Generic名前空間を参考にしてください。