C#には、複数のデータをまとめて取り扱うための方法の1つに、Listクラスがあります。
ListはC#で複数の値を効率よく扱いたいなら必須のクラスですので、コードを書いていて使う機会や見かける機会は非常に多くあります。
今回は、Listの使い方について詳しく解説をしていきたいと思います。
C#のListとは?
Listは、複数の値をまとめて1つのデータとして取り扱うためのクラスです。
似たようなデータ構造に配列と呼ばれるものがありますが、いくつかの異なる点があります。
C#における配列は、いわゆる固定長配列(静的配列)と呼ばれるもので、格納できる要素の数をあらかじめ決めた上で生成を行います。
連続したメモリ領域を確保するため、要素へのアクセスが高速なのが特徴ですが、その一方でサイズが固定のため要素の追加や削除に柔軟に対応することはできません。
反対に、List は可変長配列(動的配列)と呼ばれるものに相当する機能を持ち、要素数を事前に定める必要がなく、追加や削除などの変更を簡単に行うことができるのが特徴です。
それぞれの使い分けの基準として、生成後に要素数が変化する可能性があるかどうかや、アクセスの速さが重要かどうかが挙げられます。
事前に要素数が決まっていて、なおかつ何度もアクセスが必要な場合などには、配列の使用が適しています。
一方で、プログラムの動作内容に合わせてサイズを柔軟に対応したい場合は、Listを使用するといいでしょう。
C#のListとArrayListの違いは?
‘C#には、Listと同様に配列に似たデータ構造を持つクラスがもう1つあります。
それが、ArrayListクラスです。
ArrayListもまた、Listと同じく生成後の要素数を自在に変更できるクラスですが、Listとは大きく異なる点があります。
ArrayListクラスは、要素ごとのデータ型が違っていても同じリスト内に格納することができますが、取り出すときには必ずキャストしなければいけません。
一方で、Listの場合は生成時に指定したデータ型しか格納できない代わりに、キャストせずとも要素を取り出すことができます。
「どんなデータ型でも格納できる」 と聞くと、一見便利なように感じられるかもしれませんが、裏を返すと「どのような型が格納されているかが分からない」 とも言えます。
ArrayListを使用する場合、データ型の間違いによるエラーが発生するリスクが高く、Listを使用する場合よりも厳密にデータ型の処理を行う必要があります。
ArrayListでなければいけない理由がない限りは、基本的に Listを使用する方が安全に運用することができます。
Listの使い方
それでは、Listクラスの実際の使い方について見ていきましょう。
基本構文から、使用できる各クラスメソッドについて、順に解説していきます。
Listの基本構文と初期化の方法
まず初めに、Listを使用する際は以下のコードを最初に記述します。
using System;
using System.Collections.Generic;
これで、Listを使用するための事前準備が整います。
上記のコードを記述したら、以下の構文でListを宣言しましょう。
【基本構文】
var list = new List<データ型>();
<>内に記述したデータ型が、Listに格納できる要素の型となります。
これらの構文をまとめると、以下のようになります。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var intList = new List<int>();
}
}
}
なお、C#の実行環境が .NET 6 以降のバージョンである場合はトップレベルステートメントが使えるため、名前空間(namespace)やクラス(class)の宣言を省略して、以下のように書くこともできます。
【.NET 6 以降のサンプルコード】
using System.Collections.Generic;
var intList = new List<int>();
だいぶすっきりしましたね。練習用のコードだったり、小規模な開発の場合はこのような簡略化された書き方も使えるので、覚えておきましょう。
また、Listの宣言と同時に任意の値で初期化を行う場合は、以下のような構文で値を設定することができます。
【基本構文】
var list = new List<データ型>() {初期値};
サンプルコードで実際の動きを見てみましょう。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var intList = new List<int>() {10, 20, 30, 40, 50};
// 配列と同じようにアクセス可能
Console.WriteLine(intList[0]);
}
}
}
【.NET 6 以降のサンプルコード】
using System.Collections.Generic;
var intList = new List<int> {10, 20, 30, 40, 50};
Console.WriteLine(intList[0]);
【実行結果】
10
上述のように、Listへのアクセスは配列と同じくインデックス番号を使用して行うことができます。
AddメソッドでListに要素を追加する
宣言した Listに要素を追加する場合は、Addメソッドを使用します。
サンプルコードで実際の動きを確認してみましょう。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var strList = new List<string>();
strList.Add("田中");
strList.Add("山田");
strList.Add("鈴木");
foreach (var str in strList)
{
Console.WriteLine(str);
}
}
}
}
もしくは、以下のように書くこともできます。
【.NET 6以降のサンプルコード】
using System.Collections.Generic;
var strList = new List<string>();
strList.Add("田中");
strList.Add("山田");
strList.Add("鈴木");
foreach (var str in strList)
Console.WriteLine(str);
【実行結果】
田中
山田
鈴木
このように、宣言した Listに新しく要素を追加したい場合は、Addメソッドを使用して格納します。
RemoveメソッドでListから要素を削除する
反対に、Listから要素を削除したい場合には、Removeメソッドを使用します。
サンプルコードで実際の動きを確認してみましょう。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var strList = new List<string>() {"田中", "山田", "鈴木"};
strList.Remove("山田");
foreach (var str in strList)
{
Console.WriteLine(str);
}
}
}
}
【.NET 6以降のサンプルコード】
using System.Collections.Generic;
var strList = new List<string> {"田中", "山田", "鈴木"};
strList.Remove("山田");
foreach (var str in strList)
Console.WriteLine(str);
【実行結果】
田中
鈴木
メソッドの引数に指定した要素が削除されているのが分かると思います。
このように、Listから要素を削除する場合は Remove メソッドを使用して削除しましょう。
SortメソッドでListの要素をソートする
List内の各要素をソートしたい場合には、Sortメソッドが活用できます。
サンプルコードで動作を確認してみましょう。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var intList = new List<int>() {5, 3, 4, 1, 2};
intList.Sort();
foreach (var num in intList)
{
Console.WriteLine(num);
}
}
}
}
【.NET 6 以降のサンプルコード】
using System.Collections.Generic;
var intList = new List<int> { 5, 3, 4, 1, 2 };
intList.Sort();
foreach (var num in intList)
Console.WriteLine(num);
【実行結果】
1
2
3
4
5
Sortメソッドを使用すると、このように要素の順番が昇順に並べ替えられます。
Contains/FindでListの要素を検索する
Listでは、目的の要素を検索するためのメソッドもいくつか用意されています。
Listに要素が含まれているどうかを判定するにはContainsメソッドを使用し、より細かい条件で要素を検索するにはFindメソッドを使います。
それぞれの使用方法について見ていきましょう。
Containsメソッドの使い方
Containsメソッドを使用すると、指定の要素がリスト内に含まれているかどうかを判定することができます。
指定の要素を含む場合は True、含まない場合は Falseが返されるため、if文の条件式として使用することもできます。
以下のサンプルコードで動きを見てみましょう。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var intList = new List<int>() { 5, 3, 4, 1, 2 };
if(intList.Contains(3)) {
Console.WriteLine("3は含まれています。");
} else {
Console.WriteLine("3は含まれていません。");
}
}
}
}
【 .NET 6 以降のサンプルコード】
using System.Collections.Generic;
var intList = new List<int> { 5, 3, 4, 1, 2 };
if (intList.Contains(3))
Console.WriteLine("3は含まれています。");
else
Console.WriteLine("3は含まれていません。");
【実行結果】
3は含まれています。
上記のサンプルコードでは、指定した要素がリスト内に含まれているため、条件式の結果が Trueの場合の処理が実行されています。
このように、Containsメソッドの結果を元に条件分岐を行うこともできます。
Findメソッドの使い方
条件式を満たす値を検索したい場合は、Findメソッドを使用します。
以下のサンプルコードで動きを確認してみましょう。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var intList = new List<int>() { 1, 2, 5, 7, 9 };
int result = intList.Find( n => n > 5 );
Console.WriteLine(result);
}
}
}
【 .NET 6 以降のサンプルコード】
using System.Collections.Generic;
var intList = new List<int> {1, 2, 5, 7, 9};
int result = intList.Find(n => n > 5);
Console.WriteLine(result);
【実行結果】
7
上記の結果を見ると分かるように、Findメソッドの戻り値は、条件に一致する要素の中から一番最初の順番に位置するものだけが返されます。
IndexOfでListの要素のインデックスを取得する
同じく検索用のメソッドの1つに、IndexOfメソッドがあります。
IndexOfメソッドは、要素そのものの有無ではなく、指定する要素に対応するインデックス番号が何かであるかを検索するためのメソッドです。
以下のサンプルコードで実際の使い方を確認してみましょう。
【サンプルコード】
using System;
using System.Collections.Generic;
namespace SampleList {
class Program {
public static void Main(string[] args) {
var strList = new List<string>() {"東京", "大阪", "北海道", "沖縄", "広島"};
int result = strList.IndexOf("沖縄");
Console.WriteLine(result);
}
}
}
【 .NET 6 以降のサンプルコード】
using System.Collections.Generic;
var intList = new List<int> {1, 2, 5, 7, 9};
int result = intList.Find(n => n > 5);
Console.WriteLine(result);
【実行結果】
3
指定の要素に対するインデックス番号を取得することができました。
リスト内の要素の順番などを確認したい場合に活用することができます。
【応用編】Listを2次元配列のように扱う
C#の Listクラスには、多次元リストを宣言するための組み込みメソッドが残念ながら用意されていません。
2次元以上のリストを扱いたい場合は、以下のような形で、リストを入れ子にして定義することで実現が可能です。
【基本構文】
var list = List<List< データ型 >>();
【サンプルコード】
var numData = new List<List<int>>();
for (int i=0; i<3; i++) {
List<int> Items = new List<int>();
Items.Add(i);
Items.Add(i+10);
Items.Add(i*i);
numData.Add(Items);
}
まとめ
いかがでしたか?
Listクラスはよく利用される機能ですので、しっかりと使い方を覚えて活用していきましょう!
C#の勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、C#に限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。