C#の配列をListに変更しよう!Add・Count・foreachを初心者向けに解説
前回の記事「C#の配列はなぜ便利?Console.ReadLineとfor・foreachで人数分を処理しよう」では、最初に生徒の人数を入力し、その人数分のStudentを配列に保存しました。
人数が3人でも10人でも、for文とforeach文を使えば、コードの形を変えずに処理できました。
ところが、配列には1つだけ気になる点があります。配列は、作るときに要素数を決める必要があります。
「入力の途中で、もう1人追加したくなったらどうするの?」と感じるかもしれません。
そこで今回は、前回の配列版をList<Student>に変更します。Add、Count、foreachの基本を使いながら、あとから生徒を追加できる形に書き換えてみましょう。
前回の配列版を確認する
前回は、最初に入力した人数を使って配列を作りました。
Console.Write("生徒は何人ですか?:");
int count = int.Parse(Console.ReadLine());
Student[] students = new Student[count];
countが3なら、3人分の配列が作られます。10なら、10人分です。
その後、for文の中で作ったStudentを、配列の対応する場所に保存しました。
students[i] = student;
この書き方では、students[0]、students[1]のように、保存する場所を番号で指定します。
配列は最初に要素数を決める
配列は、一度作ると要素数をあとから変更できません。
Student[] students = new Student[3];
この配列には、3人分の場所があります。4人目を追加するための場所はありません。

Addで追加できます。配列は「最初に人数が決まっているとき」に分かりやすい入れ物です。一方、人数があとから増える可能性があるときは、List<T>が便利です。
Listを使う準備をする
List<T>を使うには、ファイルの先頭に次の1行を追加します。
using System.Collections.Generic;
List<T>は、C#のコレクションの1つです。コレクションとは、複数のデータをまとめて扱うための入れ物です。
今回のTには、入れたいデータの型であるStudentを書きます。
List<Student>
これは、「Studentを複数入れられるList」という意味です。
配列をListに変更する
まず、配列を作っていた行を見てみましょう。
Student[] students = new Student[count];
この行を、次のように変更します。
List<Student> students = new List<Student>();
配列では、作るときにcountを指定しました。Listでは、最初に要素数を指定しなくても作れます。
配列:Student[] students = new Student[count];
List:List<Student> students = new List<Student>();
この時点では、studentsの中は空です。必要になったときに、生徒を1人ずつ追加します。
Addで生徒を追加する
配列版では、作った生徒を次のように保存していました。
students[i] = student;
List版では、Addを使います。
students.Add(student);
Addは、Listの末尾に新しい要素を追加するメソッドです。
students.Add(student1); // 1人目を追加
students.Add(student2); // 2人目を追加
students.Add(student3); // 3人目を追加
配列のように「何番目へ入れるか」を指定する必要はありません。追加するたびに、Listがデータを入れる場所を用意してくれます。
Countで現在の人数を調べる
配列の要素数は、Lengthで調べました。
students.Length
Listに現在入っている要素数は、Countで調べます。
students.Count
たとえば、3人の生徒を追加した後なら、students.Countは3です。さらに1人追加すれば、自動的に4になります。
配列とListでは、要素数を表す名前が違う点に気をつけましょう。
- 配列の要素数:
Length - Listの要素数:
Count
入力処理をList版に書き換える
配列版の入力処理は、次の形でした。
for (int i = 0; i < students.Length; i++)
{
Student student = new Student();
Console.Write($"{i + 1}人目の名前を入力してください:");
student.Name = Console.ReadLine();
Console.Write($"{i + 1}人目の点数を入力してください:");
student.Score = int.Parse(Console.ReadLine());
students[i] = student;
}
List版では、繰り返す回数には最初に入力したcountを使い、最後の代入をAddに変更します。
for (int i = 0; i < count; i++)
{
Student student = new Student();
Console.Write($"{i + 1}人目の名前を入力してください:");
student.Name = Console.ReadLine();
Console.Write($"{i + 1}人目の点数を入力してください:");
student.Score = int.Parse(Console.ReadLine());
students.Add(student);
}
大きく変わったのは、最後の1行です。
配列版:students[i] = student;
List版:students.Add(student);
配列版では保存場所の番号を指定し、List版では作った生徒を末尾へ追加しています。
完成コード
using System;
using System.Collections.Generic;
namespace StudentListInputTutorial
{
internal class Program
{
static void Main(string[] args)
{
Console.Write("生徒は何人ですか?:");
int count = int.Parse(Console.ReadLine());
List<Student> students = new List<Student>();
for (int i = 0; i < count; i++)
{
Student student = new Student();
Console.Write($"{i + 1}人目の名前を入力してください:");
student.Name = Console.ReadLine();
Console.Write($"{i + 1}人目の点数を入力してください:");
student.Score = int.Parse(Console.ReadLine());
students.Add(student);
}
Console.WriteLine();
Console.WriteLine($"{students.Count}人の点数を表示します。");
foreach (var student in students)
{
student.ShowScore();
}
}
}
class Student
{
public string Name;
public int Score;
public void ShowScore()
{
Console.WriteLine($"{Name}さんの点数は{Score}点です。");
}
}
}
Visual Studioの設定によっては、Console.ReadLine()の戻り値に関する警告が表示されることがあります。まずは配列からListへ変わった部分に注目して、動きを確認してみましょう。
foreach文はそのまま使える
表示部分のforeach文は、配列版から変更する必要がありません。
foreach (var student in students)
{
student.ShowScore();
}
foreach文は、配列でもListでも、中に入っている要素を先頭から1つずつ取り出せます。
つまり、入れ物を配列からListに変更しても、「全員に同じ処理を行う」という部分は同じ書き方で使えます。
入力後にもう1人追加してみる
Listのメリットを確認するために、入力処理が終わった後でもう1人追加してみましょう。
Student newStudent = new Student();
newStudent.Name = "高橋";
newStudent.Score = 88;
students.Add(newStudent);
最初に入力した人数が3人でも、Addを使えば4人目を追加できます。配列のように、新しい大きさの入れ物を自分で作り直す必要はありません。
追加後にforeach文を実行すると、高橋さんを含む4人全員が表示されます。students.Countも、自動的に4になります。
配列とListの使い分け
配列とListは、どちらも同じ種類のデータをまとめて扱うための入れ物です。ただし、得意な場面が少し違います。
- 配列:最初から要素数が決まっていて、あとから変わらない場合
- List:要素が増えたり減ったりする可能性がある場合
たとえば、「クラスの座席は30席」と最初から決まっているなら、配列でも表現できます。一方、「参加者を申し込み順に追加する」なら、Listの方が自然です。
初心者のうちは、数が固定なら配列、あとから増えるならListと考えると、違いを整理しやすいでしょう。
初心者が気をつけたい点
List<Student>には、Studentだけを追加します。次のように、違う型の値を追加することはできません。
students.Add("田中"); // Studentではなくstringなのでエラー
また、Listにもstudents[0]のような番号があります。配列と同じく、最初の要素は0番です。
ただし、まだ何も入っていないListのstudents[0]を読み取ろうとするとエラーになります。先にAddで要素を追加してから使いましょう。
今回のまとめ
- 配列は、作るときに要素数を決める
List<Student>は、Studentをあとから追加できるAddで、Listの末尾に要素を追加できる- 配列の要素数は
Length、Listの要素数はCountで調べる foreach文は、配列でもListでも同じように使える- 数が固定なら配列、あとから増えるならListが使いやすい
Listは、必要になったときにAddでデータを増やせる入れ物です。
配列版との違いは、最初に大きさを決めないこと、保存するときにAddを使うこと、要素数をCountで調べることです。
まずは前回のコードを1行ずつList版へ変更し、同じ実行結果になることを確認してみてください。その後で4人目を追加すると、Listの便利さがよりはっきり見えてきます。









ディスカッション
コメント一覧
まだ、コメントがありません