i-school - Listと配列の使い分けガイド

 C#プログラミングにおいて、データの管理は非常に重要です。
配列は基本的なデータ構造ですが、要素の追加や削除が難しいことがあります。
そこで、動的配列である「List」を活用することで、柔軟で便利なデータ管理が可能となります。

 本記事では、Listの使い方から配列との違いについて比較して解説します。



配列と List の主な違い


 配列とListの主な違いは、サイズの可変性です。それは要素の追加と削除の違いにもつながります。

 配列は一度サイズを決めると変更が難しく、新しい要素を追加する際には新たな配列を作成して要素をコピーする必要があります。

 一方でListは、要素の追加や削除が容易で、自動的にサイズを調整します。

 配列とListは一般的に使用されるデータ構造ですが、要素の削除において大きな違いがあります。
本記事では、配列とListの要素削除の違いについて、具体的な使用例を交えて詳しく解説します。


1.配列における要素削除


 配列は要素数が固定されており、要素の削除が難しく、さらに削除後に空いた要素の管理が手間です。

 例を挙げてみましょう。

using UnityEngine;

public class ArrayDeletionExample : MonoBehaviour
{
    void Start()
    {
        string[] fruits = new string[] { "Apple", "Banana", "Orange" };

        // Bananaを削除したいが、要素の詰め直しが難しい
    }
}

 上記の例では、"Banana"を削除する際、要素の詰め直しを行うことが難しく、空いた要素の管理に手間がかかります。


2.Listにおける要素削除


 一方で、Listは要素の削除が非常に簡単で、削除後に要素が自動的に詰められます。

 以下の例を見てみましょう。

using System.Collections.Generic;
using UnityEngine;

public class ListDeletionExample : MonoBehaviour
{
    void Start()
    {
        List<string> fruits = new List<string> { "Apple", "Banana", "Orange" };

        fruits.Remove("Banana");

        foreach (string fruit in fruits)
        {
            Debug.Log("Fruit: " + fruit);
        }
    }
}

 上記の例では、List<string>を使用して"Banana"を削除しました。
このとき、要素が自動的に詰められ、空いた箇所の管理に心配する必要はありません。
List では要素の削除が簡単かつ安全に行えます。


使い分ける際の考え方


 配列は要素の数が固定である場合や、メモリ効率が重要な場合に使用します。
一方でListは、要素数が変動する可能性がある場合や、要素の追加・削除が頻繁に行われる場合に適しています。

// 配列の宣言と初期化
int[] scores = new int[3] { 100, 200, 300 };

// Listの宣言と初期化
List<int> scoreList = new (){ 100, 200, 300 };
scoreList.Add(400); // 要素の追加
scoreList.RemoveAt(0); // 要素の削除


1.要素の追加


 配列はサイズが固定されており、新しい要素を追加する際には要素数を変更する必要があります。
一方で、Listは要素の追加が容易で、サイズを気にせずに新しい要素を追加できます。

// 配列の場合
string[] array = new string[3];
// 新しい要素を追加するには要素数を変更する必要がある

// Listの場合
List<string> list = new List<string>();
// 新しい要素を追加する際、サイズの変更は不要


2.要素の削除


 配列は要素の削除が難しく、空いた要素の管理が手間です。一方で、Listは要素の削除が簡単で、削除後も要素が自動的に詰められます。

// 配列の場合
string[] array = new string[] { "Apple", "Banana", "Orange" };
// 要素を削除して空きを管理するのが難しい

// Listの場合
List<string> list = new List<string> { "Apple", "Banana", "Orange" };
list.Remove("Banana");
// 要素を削除しても自動的に詰められる



 配列とListはどちらもゲーム内で有用ですが、Listは要素の追加・削除が柔軟にできるため、
プレイヤーの進行や状態管理といったゲーム内の要素管理や操作に活用できます。
例えば、プレイヤーがアイテムを獲得するたびにListにアイテムを追加したり、敵キャラクターを動的に管理する際にListを使用することができます。

 配列とListの違いを理解し、適切に選択することで、効果的なプログラミングが可能となるでしょう。


ユースケースとサンプルコード


 

1.プレイヤーの所持アイテムリストの管理


using System.Collections.Generic;
using UnityEngine;

public class PlayerInventory : MonoBehaviour
{
    List<string> items = new List<string>();

    void Start()
    {
        // アイテムの追加
        items.Add("Sword");
        items.Add("Shield");
        items.Add("Potion");

        // アイテムの表示
        foreach (string item in items)
        {
            Debug.Log("Player has: " + item);
        }
    }
}


2.敵の出現管理


using System.Collections.Generic;
using UnityEngine;

public class EnemySpawner : MonoBehaviour
{
    public GameObject enemyPrefab;
    List<Transform> spawnPoints = new List<Transform>();

    void Start()
    {
        // スポーンポイントの取得
        foreach (Transform spawnPoint in transform)
        {
            spawnPoints.Add(spawnPoint);
        }

        // 敵の出現
        foreach (Transform spawnPoint in spawnPoints)
        {
            Instantiate(enemyPrefab, spawnPoint.position, Quaternion.identity);
        }
    }
}


3.スコアの履歴


using System.Collections.Generic;
using UnityEngine;

public class ScoreManager : MonoBehaviour
{
    List<int> scoreHistory = new List<int>();

    void AddScore(int score)
    {
        scoreHistory.Add(score);
    }

    void DisplayScoreHistory()
    {
        for (int i = 0; i < scoreHistory.Count; i++)
        {
            Debug.Log("Score #" + (i + 1) + ": " + scoreHistory[i]);
        }
    }
}



まとめ


 配列とListの使い分けは、データの変動性や操作の頻度に応じて選ぶべきです。
要素数が固定か可変か、要素の追加や削除が頻繁かどうかを考慮し、ゲーム内の処理に適したデータ構造を選択しましょう。

 ゲーム内でのデータ管理において、要素の追加や削除が頻繁に行われる場合は、Listが適しています。
Listは要素の追加や削除が容易であり、動的なデータの変化に柔軟に対応できます。

 一方、要素数が固定である場合や、要素の追加や削除がほとんどない場合には、配列が適しています。
配列は要素数が固定されているため、メモリの管理や要素へのアクセス速度などの面で効率的です。

 要素の可変性を基準にしてListと配列を選ぶことで、ゲーム内のデータ管理を効果的に行うことができます。
どちらのデータ構造も特有の利点があるため、状況に応じて適切なものを選ぶことが大切です。