C# Listの使い方のサンプル

C#のListの使い方のサンプルです。(確認環境:Microsoft Visual Studio Community 2017)

目次

仕組み Listクラスとは / ListとArrayListの違い
初期値 要素に初期値をセットする
取得する 要素を指定して取得する(a[1])
  要素をすべて取得する(for文/foreach文) / 要素数が0の場合
  指定の要素があるかを返す (Containsメソッド)
  インデックスを取得する(IndexOfメソッド)
  要素数を取得する(Countプロパティ)
追加する 末尾に要素を追加する(Addメソッド)
  位置を指定して要素を追加する(Insertメソッド)
更新する 要素を置き換える(更新)
削除する 要素を削除する-インデックスを指定 (RemoveAtメソッド)
  要素を削除する-値を指定 (Removeメソッド)
  要素を削除する-範囲を指定(RemoveRangeメソッド)
  要素をすべて削除する (Clearメソッド)
ソート 要素を逆順にする(Reverseメソッド)
使用する メソッドの引数と戻り値がリストの場合
  リストの中にリストがあるサンプル
リストから配列 リストから配列にコピーする(ToArrayメソッド)

Listクラスとは

var color = new List<string>();
color.Add("red");
color.Add("blue");
Console.WriteLine(color[0]);// red

上記はListクラスをインスタンス化して変数colorに代入しています。
この変数colorは複数の値を持てるようになります。
<>はジェネリクスです。
varキーワードを使用していて型推論が行われます。
変数colorの各値のデータ型はstringになります。

 

Listの変数の図

  • 1つの変数で同じ型の複数の値を保持できます。
  • 各項目を要素(element)といいます。
  • 要素の順序をインデックス(添字)で管理します。上記図では[0]、[1]、[2]、[3]がインデックスです。
  • サイズをあとから動的に変更できます。
  • スレッドセーフではありません(インスタンスメンバー)。
  • 以下はMicrosoftのC#のListクラスのリンクです。
    https://msdn.microsoft.com/ja-jp/library/6sh2ey19(v=vs.110).aspx

要素に初期値をセットする

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>(){ "赤", "黄", "青" };

        foreach (var b in a)
        {
            Console.WriteLine(b);// 赤 黄 青
        }
    }
}

8行目は、Listクラスをインスタンス化し、かつ初期値をセットしています。代入する変数はvarで宣言できます。
10~13行目は、foreach文で値を取得しています。

要素を指定して取得する(a[1])

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        Console.WriteLine(a[1]);// 黄
    }
}

13行目は、インデクサー([1])で要素の位置を指定して要素を取得しています。
要素の位置は、赤=0、黄=1、青=2です。

要素をすべて取得する(for文/foreach文)

using System;
using System.Collections.Generic;

class Test1
{
  static void Main()
  {
    var color = new List<string>();
    color.Add("赤");
    color.Add("黄");
    color.Add("青");

    for (var i = 0; i < color.Count; i++)
    {
      Console.WriteLine(color[i]); // 赤 黄 青が出力される
    }

    foreach (var b in color)
    {
      Console.WriteLine(b);// 赤 黄 青が出力される
    }
  }
}

13行目は、for文ですべての要素を取得しています。
18行目は、foreach文ですべての要素を取得しています。

要素数が0の場合

		var color = new List<string>();

		foreach (var c in color)
		{
			Console.WriteLine(c);// 出力されない エラーにならない
		}

ループ対象のオブジェクトの要素数が0の場合でforeachの処理を行った場合は、エラーにはならず、出力もされません。

指定の要素があるかを返す (Containsメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a = new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        if (a.Contains("青")){
            Console.WriteLine("Trueです"); //Trueですと出力される
        }
    }
}

13行目は、Containsメソッドで指定の要素があるかを取得しています。
ある場合trueです。

インデックスを取得する(IndexOfメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a = new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        Console.WriteLine(a.IndexOf("黄")); // 1が出力される
    }
}

13行目は、IndexOfメソッドで指定の値があるインデックスを取得します。
インデックスは0から始まります。

要素数を取得する (Countプロパティ) 

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        Console.WriteLine(a.Count);// 3
    }
}

13行目は、Countプロパティで要素数を取得しています。

末尾に要素を追加する(Addメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        foreach (var b in a)
        {
            Console.WriteLine(b);// 赤 黄 青
        }
    }
}

8行目は、Listクラスをインスタンス化しています。
9~11行目は、Addメソッドでリストの末尾に要素を追加しています。
15~18行目は、foreach文で値を取得しています。

位置を指定して要素を追加する(Insertメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        a.Insert(0, "オレンジ");

        foreach (var b in a)
        {
            Console.WriteLine(b);// オレンジ 赤 黄 青
        }
    }
}

13行目は、Insertメソッドでリストの位置を指定して要素を追加しています。先頭の位置は0です。

要素を置き換える(更新)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a = new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        a[1] = "オレンジ";

        foreach (var b in a)
        {
            Console.WriteLine(b);// 赤 オレンジ 青
        }
    }
}

13行目は、インデクサー([1])で要素の位置を指定して要素を置き換えています。
要素の位置は、赤=0、黄=1、青=2です。

要素を削除する-インデックスを指定(RemoveAtメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        a.RemoveAt(0);

        foreach (var b in a)
        {
            Console.WriteLine(b);// 黄 青
        }
    }
}

13行目は、RemoveAtメソッドでインデックスを指定して削除しています。インデックスは0から始まります。

要素を削除する-値を指定(Removeメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a = new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        a.Remove("黄");

        foreach (var b in a)
        {
            Console.WriteLine(b);// 赤 青
        }
    }
}

13行目は、Removeメソッドで値を指定して削除しています。

要素を削除する-範囲を指定(RemoveRangeメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a = new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");
        a.Add("緑");

       a.RemoveRange(1,2);

        foreach (var b in a)
        {
            Console.WriteLine(b);// 赤 緑
        }
    }
}

14行目は、RemoveRangeメソッドでリストの範囲を指定して要素を削除しています。
1つめの引数はインデックスで、2つめの引数は要素の数です。
インデックスは0から始まります。

要素をすべて削除する (Clearメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>();
        a.Add("赤");
        a.Add("黄");
        a.Add("青");

        a.Clear();

        Console.WriteLine(a.Count);// 0
    }
}

13行目は、Clearメソッドですべての要素を削除しています。

要素を逆順にする(Reverseメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>() { "赤", "黄", "青" };

        a.Reverse();

        foreach (var b in a)
        {
            Console.WriteLine(b);// 青 黄 赤
        }
    }
}

10行目は、Reverseメソッドで要素を逆順にしています。

メソッドの引数と戻り値がリストの場合

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var color = new List<string>() { "赤", "黄", "青" };

        var b = new List<string>();
        b = printColor(color);
    }

    private static List<string> printColor(List<string> a)
    {
        return a;
    }
}

11行目は、呼び出し元のメソッドです。引数にリストを指定しています。戻り値もリストです。
14行目は、定義されたメソッドです。「List<string> a」のaが変数で、その前がデータ型のリストです。

呼び出し元のメソッドの引数の変数名(11行目のcolor)と定義されたメソッドの引数の変数名(14行目のa)は異なっていても使用できます。

リストの中にリストがあるサンプル

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var list1 = new List<List<string>> ();

        var list2 = new List<string>();
        list2.Add("赤");
        list2.Add("黄");
        list2.Add("青");

        var list3 = new List<string>();
        list3.Add("red");
        list3.Add("yellow");
        list3.Add("blue");

        list1.Add(list2);
        list1.Add(list3);

        Console.WriteLine(list1[0][0]); // 赤
        Console.WriteLine(list1[0][1]); // 黄
        Console.WriteLine(list1[0][2]); // 青
        Console.WriteLine(list1[1][0]); // red
        Console.WriteLine(list1[1][1]); // yellow
        Console.WriteLine(list1[1][2]); // blue
    }
}

8行目は、リストの中にリストを定義しています。
10~18行目は、通常のリストを作成しています。
20,21行目は、リストにリストを追加しています。
23~28行目は、リストの値を取得しています。

リストから配列にコピーする(ToArrayメソッド)

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        var a= new List<string>() { "赤", "黄", "青" };

        string[] b= a.ToArray();

        //b.Add("オレンジ"); リストでないのでエラーになる
    }
}

8行目は、Listです。
10行目は、ToArrayメソッドでリストを新しい配列にコピーしています。

 

ListとArrayListの違い

using System;
using System.Collections.Generic;
using System.Collections;
class Test1
{
    static void Main()
    {
        var a= new ArrayList();
        a.Add("赤");
        a.Add(1);

        var b= new List<string>();
        b.Add("赤");
        //b.Add(1); エラー
    }
}

8行目は、ArrayListです。
9,10行目のように異なる型の値を代入できます。

12行目は、Listです。ジェネリクスでstringを指定しています。
→同じ型(string)の値のみ代入できます。
14行目はstring型ではないのでエラーになります。

関連の記事

C# Dictionaryの使い方のサンプル
C# HashSetの使い方のサンプル

△上に戻る