クラスのインスタンスをListにする

2022年8月22日

同一クラスから生成したインスタンスをまとめて加工、特定条件で抽出するなどの処理をするためにListにします

基本

まず基本からです
オブジェクト指向の基本知識とコレクションの知識が必要です
サンプルコードをみてください

基本となるクラスとインスタンス作成

class People
{
    public string Name { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        People people1 = new People();
        people1.Name = "田中";
        people1.Age = 35;
        People people2 = new People();
        people2.Name = "山田";
        people2.Age = 20;
        Console.WriteLine(people1.Name);
    }
}

実行結果

田中

2人のインスタンス(模擬人間)を作りました。
people1変数とpeople2変数です。この変数は、People型で参照型になります。

people1の名前を知りたいとき、インスタンス名.メンバー変数名でアクセスするとそのデータを取り出すことができます。言葉で言い換えると、「people1の名前」になります。

people1.Name

データとして管理する

今は2人ですが、これが20人、200人、2000人とどんどん増えれば扱いが大変になってきます。ここで、配列やListの登場です。

例えば、int型のListの場合、

List<int> numbers = new List<int>();
numbers.Add(20);
numbers.Add(10);

というようにデータを増やしていくことでができます。

<>の中には、型が記述されています。
これを使って、Peopleを管理してみます。

上記のコードを変化させて、

List<People> people = new List<People>();

とします。

次にListに追加します。

List<People> people = new List<People>();
people.Add(people1);
people.Add(people2);

読みだすには、次のようにします。

string name = people[0].Name;
Console.WriteLine(name);

インライン(1行にまとめる)と、

Console.WriteLine(people[0].Name);

でもいいです。(同じ処理)

最終的なコードサンプル

  • 初期値をコンストラクタで代入
  • Listの初期値代入省略
  • 暗黙の型宣言(var)を適用
  • 全てのListデータの表示
class People
{
    public string Name { get; set; }
    public int Age { get; set; }
    public People(string name, int age)
    {
        Name = name;
        Age = age;
    }
}
class Program
{
    static void Main(string[] args)
    {
        var people1 = new People("田中", 35);
        var people2 = new People("山田", 20);
        var people = new List<People>
        {
            people1,
            people2
        };
        foreach (var person in people)
        {
            Console.WriteLine(person);
        }
    }
}

実行結果

田中
山田

応用

条件に合った検索

25歳以上だけ抽出したい

class People
{
    public string Name { get; set; }
    public int Age { get; set; }
    public People(string name, int age)
    {
        Name = name;
        Age = age;
    }
}
class Program
{
    static void Main(string[] args)
    {
        var people1 = new People("田中", 35);
        var people2 = new People("山田", 20);
        var people = new List<People>
        {
            people1,
            people2
        };

        var overAge25People = people.Where(person => person > 25);
        foreach (var person in overAge25People)
        {
            Console.WriteLine(person);
        }
    }
}

実行結果

田中

派生クラスをまたぐ検索をしたい

2人は先生と生徒クラスだとします
先生や生徒関係なく抽出をしたい場合になります

class People
{
    public string Name { get; set; }
    public int Age { get; set; }
    public People(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Teacher : People
{
    public Teacher(string name, int age) : base(name, age)
    {
    }
}

class Student : People
{
    public Student(string name, int age) : base(name, age)
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        People people1 = new Teacher("田中", 35);
        People people2 = new Student("山田", 20);
        var people = new List<People>
        {
            people1,
            people2
        };

        var overAge25People = people.Where(person => person > 25);
        foreach (var person in overAge25People)
        {
            Console.WriteLine(person);
        }
    }
}

実行結果

田中

C#

Posted by hidepon