C#プチリファレンス

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
ToTop