C#の配列をListに変更しよう!Add・Count・foreachを初心者向けに解説

広告

前回の記事「C#の配列はなぜ便利?Console.ReadLineとfor・foreachで人数分を処理しよう」では、最初に生徒の人数を入力し、その人数分のStudentを配列に保存しました。

人数が3人でも10人でも、for文とforeach文を使えば、コードの形を変えずに処理できました。

ところが、配列には1つだけ気になる点があります。配列は、作るときに要素数を決める必要があります。

「入力の途中で、もう1人追加したくなったらどうするの?」と感じるかもしれません。

そこで今回は、前回の配列版をList<Student>に変更します。AddCountforeachの基本を使いながら、あとから生徒を追加できる形に書き換えてみましょう。

前回の配列版を確認する

前回は、最初に入力した人数を使って配列を作りました。

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人目を追加するための場所はありません。

配列は最初に数を決める固定長の入れ物、ListはAddであとから要素を追加できる入れ物として比較した図
配列は最初に要素数を決めます。Listは必要になったときに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の便利さがよりはっきり見えてきます。

訪問数 11 回, 今日の訪問数 15回

広告