C#

C# | Listの宣言と初期化: 効果的な方法と実践ガイド

2024年5月3日

本ページはプロモーションが含まれています

C#Listアイキャッチ画像

List は、C#で頻繁に使用される動的な配列のようなデータ構造です。

// Listの作成と初期化
List<int> numbers = new List<int>();

// 要素の追加
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);

// 要素の取得
int secondNumber = numbers[1]; // 2

// 要素の削除
numbers.Remove(2); // 値が2の要素を削除

// リストの長さ
int count = numbers.Count; // 2(要素1と3が残っている)

List は、C#で多くの場面で使用されるデータ構造であり、動的なデータ管理や操作が必要な場合に便利です。

List<T>の主な疑問や問題点を挙げてみます。

  • リストの初期化方法は何種類あるのか?
  • インデックス番号は何から始まるのか?
  • リストの初期化時に容量を設定する必要はあるか?
  • リストの初期化時に要素を追加する方法と後から追加する方法
  • 初期化時に指定できるデータ型に制限はあるか?
  • リストの初期化時に他のコレクションからデータをコピーする方法

この記事ではこれらについても詳しく解説します。

List<T>の概要

ポイント

List<T>は簡単に言えば動的な配列と考えることができます。

動的な配列とは、要素の追加や削除が自由にできる配列のようなものです。

List<T>の特徴

  • ジェネリック型: 任意のデータ型を保持できる。
  • 動的サイズ変更: 要素の追加や削除に応じて自動的にサイズが調整される。
  • インデクサ: インデックスを使って要素にアクセスできる。
  • 要素の追加と削除AddRemoveInsertRemoveAt メソッドを使用して操作可能。
  • ソートと検索Sort メソッドでソート、ContainsIndexOf メソッドで検索が可能。
  • ループ処理foreachfor で要素をループ処理できる。

List<T> の宣言と初期化方法

以下にList<T>の宣言の例を示します。

空のリストを作成する場合

List<int> intList = new List<int>();

コードの解説

  • List<int>: ジェネリックリストの型。int はリストに格納する要素の型を指定します。この場合、整数型(int)の要素を格納します。
  • intList: リストの変数名。好きな名前をつけることができます。
  • new List<int>(): 新しい List<int> オブジェクトを作成し、その参照を intList に割り当てます。このリストは空であり、要素はまだ一つも含まれていません。

初期値を持つリストを作成する場合

List<string> stringList = new List<string> { "りんご", "バナナ", "チェリー" };

他のコレクションからリストを作成する場合

int[] numbers = { 1, 2, 3, 4, 5 };
List<int> numberList = new List<int>(numbers);

List<T> のインデックス

List<T>のインデックスは 0 から始まります。

  • intList[0]最初の要素を指します。
  • intList[1]2番目の要素を指します。
  • intList[2]3番目の要素を指します。
  • intList[3]4番目の要素を指します。
  • intList[4]5番目の要素を指します。

リストの初期化時に容量を設定する必要はあるか?

基本的に、リストは動的な配列と見なせるため、容量の設定は必須ではありません。
リストは要素が追加される際に自動的に容量を拡張するため、特に容量を設定しなくても多くの場合で問題なく動作します。

容量設定が不要な理由

  • 動的な拡張
    • リストは内部的に動的に容量を拡張します。要素が追加されると、現在の容量が不足している場合、自動的に新しい容量が確保され、既存の要素が新しい配列にコピーされます。このため、容量を気にせずに要素を追加できます。
  • デフォルトの容量管理
    • リストは初期化時にデフォルトの容量を持ち、要素が追加されると容量が倍増されるなどの戦略で自動的に管理されます。これにより、プログラムは容量を明示的に設定することなく効率的に動作します。

容量設定が有益な場合

それでも、特定の状況では容量を設定することが有益な場合もあります。

  1. 大量の要素を一度に追加する場合
    • 大量の要素を一度に追加する場合、初期容量を設定しておくことで、容量の再割り当てとコピー操作を減らし、パフォーマンスを向上させることができます。
  2. メモリ管理が重要な場合
    • 予め容量を設定することで、不要なメモリの割り当てを防ぎ、メモリ使用量を効率的に管理できます。特に、リソースが限られた環境やメモリ使用量が問題となる場合に有効です。

結論

  • 一般的な使用: 容量を設定する必要はなく、リストは動的に容量を管理するため、安心して使用できます。
  • 特定のケース: 大量の要素を追加する場合や、メモリ管理が重要な場合には、初期容量を設定することで効率を向上させることができます。

リストの初期化時に要素を追加する方法と後から追加する方法

初期化時に要素を追加する方法

// リストの宣言と初期化時に要素を追加する
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

後から要素を追加する方法

// 空のリストを生成する
List<string> fruits = new List<string>();

// 後から要素を追加する
fruits.Add("りんご");
fruits.Add("バナナ");
fruits.Add("オレンジ");

まとめ

  • 初期化時に要素を追加する方法: 初期化と同時にリストに要素を追加することで、初期化コードが簡潔になり、読みやすくなります。
  • 後から要素を追加する方法: 空のリストを生成して、後から .Add() メソッドで要素を追加することで、動的な要素の管理が可能です。

初期化時に指定できるデータ型に制限はあるか?

C# の List<T> で初期化する際に指定できるデータ型に特別な制限はありません。

主に以下のようなデータ型を初期化時に指定することができます。

  • 整数型のリストList<int>
  • 文字列型のリストList<string>
  • カスタムクラスのリストList<MyClass>
  • 構造体のリストList<MyStruct>
  • 列挙型のリストList<MyEnum>

カスタムクラス

using System;
using System.Collections.Generic;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person("Alice", 30),
            new Person("Bob", 25)
        };
        people.Add(new Person("Charlie", 35)); // 新しい人を追加

        foreach (Person person in people)
        {
            Console.WriteLine($"{person.Name}, Age: {person.Age}");
        }
    }
}

構造体

using System;
using System.Collections.Generic;

struct Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

class Program
{
    static void Main()
    {
        List<Point> points = new List<Point>
        {
            new Point(0, 0),
            new Point(10, 10)
        };
        points.Add(new Point(5, 5)); // 新しいポイントを追加

        foreach (Point point in points)
        {
            Console.WriteLine($"X: {point.X}, Y: {point.Y}");
        }
    }
}

リストの初期化時に他のコレクションからデータをコピーする方法

C# において、他のコレクションからデータをコピーして List<T> を初期化する方法はいくつかあります。
主な方法をいくつか紹介します。

コレクション初期化子を使う

List<T> のコンストラクタには、他のコレクションを引数として受け取るオーバーロードがあります。
これを使うと、指定したコレクションからデータをコピーして新しいリストを作成できます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int[] numbersArray = { 1, 2, 3, 4, 5 };
        List<int> numbersList = new List<int>(numbersArray);

        foreach (int number in numbersList)
        {
            Console.WriteLine(number);
        }
    }
}

AddRange メソッドを利用する方法

List<T>AddRange メソッドを使って、別のコレクションの要素を追加することができます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbersList = new List<int>();
        int[] numbersArray = { 1, 2, 3, 4, 5 };
        numbersList.AddRange(numbersArray);

        foreach (int number in numbersList)
        {
            Console.WriteLine(number);
        }
    }
}

LINQ を使用する

LINQ クエリを使用して、既存のコレクションから新しいリストを作成することもできます。
ToList メソッドを使用することで、結果をリストとして取得できます。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> originalList = new List<int> { 1, 2, 3, 4, 5 };
        List<int> newList = originalList.Where(n => n % 2 == 0).ToList();

        foreach (int number in newList)
        {
            Console.WriteLine(number);
        }
    }
}

まとめ

  • リストのインデックス番号は0から始まります。
  • リストの初期化時に特別な容量の設定は必要ありません。内部的に必要に応じて容量が増減します。
  • 初期化時の追加: コンストラクタや初期化リストで要素を一括して追加します。
  • 後からの追加Add メソッドや AddRange メソッドを使って、既存のリストに要素を追加します。
  • 初期化時に指定できるデータ型の制限:特に制限はありません。プリミティブ型、クラス、構造体、他のジェネリック型など、幅広いデータ型を要素として持つことができます。
  • 他のコレクションからのデータのコピー方法
    • コレクション初期化子を使う方法
    • AddRange メソッドを使って他のコレクションの要素を追加する方法
    • LINQ を使用する方法

Follow me!

-C#
-,

PAGE TOP