ジェネリックコレクションの1つであるListクラスの使い方のまとめです。
リストは同じ型のデータを複数まとめて扱うことができます。
配列に似ていますがリストは要素の追加、削除を行うことができます。
また、リストは要素の並びはデータを追加、挿入したとおりの順番になります。
各要素のアクセスには0から始まる番号(インデックス)を使います。
Listクラスの使い方
Listクラスを使うには名前空間System.Collections.Genericが必要です。
using System.Collections.Generic;
Listオブジェクトの宣言について
Listの宣言は、
List<T> リストの名前;
のように書きます。Tの部分にはintやstringなどリストに格納するデータの型を指定します。
List<int> list_int;
List<long> list_long;
List<string> list_str;
Listの初期化と値の代入について
C#12以降の場合
C#12から [] を使うことでListの初期化と初期値の設定が簡単に書けるようになりました。コレクション式というらしい。
[ と ] の間にカンマ区切りで値を指定することで初期化と初期値を設定することが同時にできます。
また、[] とすることで初期化できるようになりました。
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
//初期化
List<int> list_int0 = []; //C#12より前は「List<int> list_int0 = new List<int>();」
List<string> list_str0 = []; //C#12より前は「List<string> list_str0 = new List<string>();」
//初期化+初期値設定
List<int> list_int1 = [1, 2, 3]; //C#12より前は「List<int> list_int1 = new List<int>(){1, 2, 3};」
List<string> list_str1 = ["あ", "い", "う", "え", "お"]; //C#12より前は「List<string> list_str1 = new List<string>(){"あ", "い", "う", "え", "お"};」
}
}
}
同じデータ型の変数を初期値として指定することもできます。
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
string str1 = "a";
string str2 = "b";
string str3 = "c";
List<string> list_str = [str1, str2, str3, "d"];
}
}
}
すでにあるリストを使って値を代入することもできます。
[ ] に「.. リスト名」のように記載するとすでにあるリストを初期値として利用できます。
.. はSpread要素というらしい。
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
List<int> list_int1 = [1, 2, 3];
List<int> list_int2 = [10, 20, 30];
//他のリストを初期値として利用する
List<int> list_int3 = [.. list_int1, 99, .. list_int2];
foreach(var value in list_int3) Console.WriteLine(value);
}
}
}
list_int3はこんな感じになる、
1
2
3
99
10
20
30
C#12より前の場合
クラスなので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>>();
}
}
配列と同じように宣言と同時に値を代入することができます。
{ } の中に値を指定します。
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);
});
}
}
範囲を指定して要素を取り出す
インデクサーの範囲指定( .. )で範囲を指定して要素を取り出すことができます。
インデックス i 番目から j 番目 の範囲という指定ができます。
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
List<int> list_int = [1, 2, 3, 4, 5, 6, 7, 8, 9];
//範囲を指定して要素を取り出す(新しいListが作られる)
List<int> list_range = list_int[2..5];
//範囲を指定して作ったリストの各要素を表示
foreach(var val in list_range)
{
Console.WriteLine(val);
}
}
}
}
上記コードの出力結果はこんな感じになります
3
4
5
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# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント