C# List型(System.Collections.Generic.List)
List型は要素を順番に保持するコレクションクラスです。
リストのインデックス番号は0から始まりますので、例えば要素の3番目を指定したい場合は、インデックス番号では2を指定することになるのでご注意ください。
コレクション型共通のサンプルについては、「コレクション型 共通」をご覧ください。
Listを作成する
- 例)Listを生成する(string型)
-
using System.Collections.Generic; List<string> list = new List<string>();
要素の追加
- 例)Listに要素を追加する
-
// 要素"hoge"をリストの末尾に追加する list.Add("hoge"); // リストの3番目に要素"hoge2"を挿入する list.Insert(2, "hoge2");
要素の取得
- 例)Listから要素を取得する
-
// 2番目の要素を取得する string str = list[1]; // 末尾の要素を取得する string str = list[list.Count-1];
要素の更新
- 例)リストの2番目の要素を「hoge2」に更新する
-
list[1] = "hoge2";
要素の削除
- 例)Listの要素を削除する
-
// 2番目の要素を削除する list.RemoveAt(1); // 要素「hoge2」を削除する list.Remove("hoge2"); // 2番目~4番目の要素を削除する list.RemoveRange(1, 3); // 全ての要素を削除する list.Clear();
Listの要素数を取得する
- 例)Listの要素数を取得する
-
int cnt = list.Count;
要素に存在するか判定する
- 例)Listに"hoge"が存在するかどうか判定する
-
bool b = list.Contains("hoge");
Listの要素の並び順を逆転させる
- 例)Listの要素の並び順を逆転させる
-
List<string> revlist = list.Reverse();
List型を配列に変換する
- 例)List型を配列に変換する
-
string[] ar = list.ToArray();
Listの全ての要素を取り出す
Listの中身を1つ1つ取り出して処理したい場合は、foreach文が便利です。
- 例)foreachで取り出す
-
// 全要素をループ foreach (string str in list) { Console.WriteLine(str); }
上のforeach文はこれと同じ意味です。
- 例)forで取り出す
-
// 全要素をループ for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); }
リストの要素を順番に削除する
リストの要素を順番に削除していくサンプルです。
こういった場合は、Listの末尾から順番にループしていきます。
- 例)Listの要素が"***"のものを削除する。
-
List<string> list = new List<string>(); list.Add("aaa"); list.Add("***"); list.Add("bbb"); list.Add("***"); list.Add("ccc"); for (int i = list.Count - 1; i >= 0; i--) { if (list[i] == "***") { list.RemoveAt(i); } }
ソートする
Listをソートするサンプルです。
- 例)キーの降順にソートする
-
List<KeyValuePair<int, string>> list = new List<KeyValuePair<int, string>>(); KeyValuePair<int, string> vp1 = new KeyValuePair<int, string>(1, "AAA"); KeyValuePair<int, string> vp2 = new KeyValuePair<int, string>(2, "BBB"); KeyValuePair<int, string> vp3 = new KeyValuePair<int, string>(3, "CCC"); list.Add(vp1); list.Add(vp2); list.Add(vp3); list.Sort((a, b) => b.Key - a.Key);
- 【結果】
- list[0] → 3, "CCC" list[1] → 2, "BBB" list[2] → 1, "AAA"
LINQでソートする書き方もあります。詳細は、以下ページのソート欄をご覧ください。
複数キーでソートする
独自クラスのList型を複数キーでソートするサンプルです。
- 【データクラス】
-
class Sample{ public int Code1 { get; set; } public int Code2 { get; set; } }
- 【サンプルList】
-
List<Sample> list = new List<Sample>(); Sample s; s = new Sample(); s.Code1 = 1; s.Code2 = 2; list.Add(s); s = new Sample(); s.Code1 = 2; s.Code2 = 2; list.Add(s); s = new Sample(); s.Code1 = 1; s.Code2 = 3; list.Add(s); s = new Sample(); s.Code1 = 2; s.Code2 = 1; list.Add(s); s = new Sample(); s.Code1 = 1; s.Code2 = 1; list.Add(s);
- 例)Code1,Code2の昇順でソートする
-
list = list.OrderBy(n => n.Code1) .ThenBy(n => n.Code2) .ToList();
- 【結果】
- 1-1 1-2 1-3 2-1 2-2
- 例)Code1,Code2の降順でソートする
-
list = list.OrderByDescending(n => n.Code1) .ThenByDescending(n => n.Code2) .ToList();
- 【結果】
- 2-2 2-1 1-3 1-2 1-1
詳細は、以下ページのソート欄もご覧ください。
2つのListの値を条件に従い抽出する
- 例)2つのListの値が一致するものを抽出する
-
//1つめのList List<string> list1 = new List<string>(); list1.Add("AAA"); list1.Add("BBB"); list1.Add("CCC"); //2つめのList List<string> list2 = new List<string>(); list2.Add("AAA"); list2.Add("CCC"); //2つのList両方に値が存在するもののみ抽出する List<string> res = new List<string>(); //Listの結合 list1.ForEach(a => { list2.ForEach(b => { if (a == b) { res.Add(a); } }); });
- 【resの要素の結果】
- AAA CCC