PR

[C#] リスト(List)の使い方まとめ

ジェネリックコレクションの1つであるListクラスの使い方のまとめです。

リストは同じ型のデータを複数まとめて扱うことができます。
配列に似ていますがリストは要素の追加、削除を行うことができます。

また、リストは要素の並びはデータを追加、挿入したとおりの順番になります。
各要素のアクセスには0から始まる番号(インデックス)を使います。

スポンサーリンク

Listクラスの使い方

Listクラスを使うには名前空間System.Collections.Genericが必要です。

using System.Collections.Generic;
スポンサーリンク

Listオブジェクトの宣言と初期化

クラスなのでnewキーワードでインスタンスを作成して使います。
また、ジェネリッククラスなのでデータ型を指定する必要があります。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        List<int> intList = new List<int>();
        List<string> strList = new List<string>();
        List<List<int>> intListList = new List<List<int>>();
    }
}

データ型はListの後ろに <データ型> で指定します。
リストのリストも作成できます。List<List<int>> はint型のリストのリストになります。
2回もList<List<int>>と書くのは面倒なので var を使うと便利です。

var intListList = new List<List<int>>();

配列と同じように宣言と同時に値を代入することができます。
{ } の中に値を指定します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // 宣言と同時に初期化
        List<int> intList = new List<int>() { 1, 2, 3, 4, 5 };

        List<string> strList = new List<string>() { "a", "b", "c" };

        List<List<int>> intListList = new List<List<int>>() { 
            new List<int>{ 1, 2, 3, 4 },
            new List<int>{ 5, 6, 7, 8 },
        };

    }
}
スポンサーリンク

要素の追加(Add)

Addメソッドを使うと末尾に要素を追加します。
引数に指定できるのはListの宣言時に指定したデータ型の値になります。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>();
        intList.Add(1);
        intList.Add(2);
        intList.Add(3);

        var strList = new List<string>();
        strList.Add("a");
        strList.Add("b");
        strList.Add("c");

        var intListList = new List<List<int>>();
        intListList.Add(new List<int> { 1, 2, 3 });
        intListList.Add(new List<int> { 4, 5, 6 });
    }
}
スポンサーリンク

要素の挿入(Insert)

Insertメソッドを使うと指定した場所に要素を追加します。
第1引数に0から始まる要素の番号(インデックス)を指定し、
第2引数に追加する値を指定します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        List<int> intList = new List<int>();
        intList.Add(1);
        intList.Add(2);
        intList.Insert(0, 3);
        Console.WriteLine($"intList={string.Join(",", intList)}");

        List<string> strList = new List<string>();
        strList.Add("a");
        strList.Add("b");
        strList.Insert(1, "c");
        Console.WriteLine($"strList={string.Join(",", strList)}");

        List<List<int>> intListList = new List<List<int>>();
        intListList.Add(new List<int> { 1, 2, 3 });
        intListList.Add(new List<int> { 4, 5, 6 });
        intListList.Insert(2, new List<int> { 7, 8, 9 });
        Console.WriteLine("intListList=");
        foreach (var list in intListList) {
            Console.WriteLine(string.Join(",", list));
        }
    }
}

出力結果はこんな感じです。

intList=3,1,2
strList=a,c,b
intListList=
1,2,3
4,5,6
7,8,9

Console.WriteLineで使ってる $ ってなに?という人はこちらを、
string.Joinって何?という人はこちらをご覧ください。

スポンサーリンク

同じ型のコレクションと結合する(AddRange)

AddRangeメソッドを使うとListの要素の末尾に同じ型のコレクションの要素を追加することができます。
引数にはListと同じ型のコレクションを指定します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int> { 1, 2, 3 };
        intList.AddRange(new List<int> { 4, 5, 6 });
        Console.WriteLine($"intList={string.Join(",", intList)}");

        var strList = new List<string>() { "a", "b", "c" };
        var addStrList = new List<string>() { "d", "e", "f" };
        strList.AddRange(addStrList);
        Console.WriteLine($"strList={string.Join(",", strList)}");

        var intListList = new List<List<int>>() { new List<int> { 1, 2, 3, 4 } };
        intListList.AddRange(new List<List<int>> { new List<int> { 5, 6, 7 } });
        Console.WriteLine("intListList=");
        foreach (var list in intListList) {
            Console.WriteLine(string.Join(",", list));
        }
    }
}

出力結果はこんな感じです。

intList=1,2,3,4,5,6
strList=a,b,c,d,e,f
intListList=
1,2,3,4
5,6,7

要素をすべて削除する(Clear)

Clearメソッドを使うと要素をすべて削除することができます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>();
        intList.Add(1);
        intList.Add(2);
        intList.Add(3);
        Console.WriteLine($"intList={string.Join(",", intList)}");

        intList.Clear();
        Console.WriteLine($"intList={string.Join(",", intList)}");
    }
}
intList=1,2,3
intList=

インデックスを指定して要素を削除する(RemoveAt)

RemoveAtメソッドを使うとインデックスを指定して要素を削除することができます。
引数には0から始まる要素の番号(インデックス)を指定します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>();
        intList.Add(1);
        intList.Add(2);
        intList.Add(3);
        Console.WriteLine($"intList={string.Join(",", intList)}");

        intList.RemoveAt(1);
        Console.WriteLine($"intList={string.Join(",", intList)}");
    }
}

出力結果はこんな感じです。

intList=1,2,3
intList=1,3

値を指定して要素を削除する(Remove)

Removeメソッドを使うと値を指定して要素を削除することができます。
引数には削除したい値を指定します。
Removeは先頭の要素から値の検索をして初めに見つかった要素を削除します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>();
        intList.Add(1);
        intList.Add(2);
        intList.Add(3);
        intList.Add(2);
        Console.WriteLine($"intList={string.Join(",", intList)}");

        intList.Remove(2);
        Console.WriteLine($"intList={string.Join(",", intList)}");
    }
}

出力結果はこんな感じです。

intList=1,2,3,2
intList=1,3,2

リストの要素数を取得する(Count)

Listの要素数を調べるにはCountプロパティを使います。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>();
        intList.Add(1);
        intList.Add(2);
        intList.Add(3);
        Console.WriteLine($"intList={string.Join(",", intList)}");
        Console.WriteLine($"要素数={intList.Count}");
    }
}
intList=1,2,3
要素数=3

要素の値を変更する(インデクサ)

インデクサ [ ] を使い要素を指定して値を変更することができます。
インデクサには0から始まる要素番号(インデックス)を指定します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>() { 10, 20, 30, 40 };
        Console.WriteLine($"intList={string.Join(",", intList)}");
        // インデックスで要素を指定して値を変更する
        intList[1] = 80;
        intList[3] = 100;
        Console.WriteLine($"intList={string.Join(",", intList)}");
    }
}
intList=10,20,30,40
intList=10,80,30,100

各要素を取り出す

リストの各要素を取り出すには、インデクサ [ ] に0から始まる要素番号(インデックス)を指定します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>() { 10, 20, 30, 40 };
        // インデックスを指定して各要素を取り出す
        Console.WriteLine(intList[0]);  // 10
        Console.WriteLine(intList[1]);  // 20
        Console.WriteLine(intList[2]);  // 30
        Console.WriteLine(intList[3]);  // 40

        /*
         インデックスを使ってforで要素数だけ
         ループして要素を取り出すことができる
        */
        for (int i = 0; i < intList.Count; i++) {
            Console.WriteLine(intList[i]);
        }
    }
}

また、foreachを使って各要素を順番に取り出すことができます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        var intList = new List<int>() { 10, 20, 30, 40 };
        // foreachを使って各要素を順番に取り出す
        foreach (var i in intList) {
            Console.WriteLine(i);
        }
    }
}
10
20
30
40

各要素を取り出して順番に処理する(foreach)

ListオブジェクトのForEachメソッドを使うとListの各要素を順番に取り出して処理を行うことが出来ます。

ForEachメソッドの引数はList要素のデータ型を引数とするメソッド(デリゲート型)です。通常はラムダ式で無名関数を作って渡します。

ラムダ式については、
[C# 入門] 匿名関数(ラムダ式)の使い道
[C#] デリゲートとラムダ式について
を見てください。

using System;
using System.Collections.Generic;
class Program
{
    public static void Main()
    {
        // リストの宣言と初期化
        List<int> list = new List<int> { 1, 2, 3, 4, 5 };

        // ForEachメソッドで各要素を順番に処理する
        list.ForEach(i => {
            Console.WriteLine(i);
        });
    }
}

LINQを使ってリストをさらに使いやすく

LINQの機能を使うと条件を指定してリストから要素を取り出したり、キーとなる値を指定して要素を並び替えたりと自由自在にリストからデータを取り出すことができるようになります。

LINQの機能について知りたい方はこちらを見てください。

こんな感じのことができます。

メソッドこんなことができる解説ページ
Selectリストを別の型のリストへ変換[C# LINQ] Selectメソッドで各要素から必要な項目を取り出す
Where条件を指定して条件を満たす要素だけを取り出す[C# LINQ] Whereメソッドで条件を満たす要素だけを取り出す
OrderByキーとなる値を指定して要素を昇順、降順に並び替える[C# LINQ] データを昇順、降順に並び替える(OrderBy)
All条件を指定して、すべての要素がその条件を満たすか判定する[C# LINQ] 配列、リストのすべての要素が条件を満たすか判定する(All)
Any条件を指定して、その条件を満たす要素が存在するか判定する[C# LINQ] 配列、リストに条件を満たす要素が含まれているか判定する(Any)
First条件を指定して、その条件を満たす最初の要素を取得する[C# LINQ] 配列、リストから条件を満たす最初の要素を取得する(First、FirstOrDefault)

C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント