UnityとゲームAIと将棋

Unity、Pythonを中心にゲーム開発やゲームAI開発の技術メモ等、たまに将棋も

【C#】List<T>とIEnumerable<T>の選択についてのメモ

結論

メソッド引数の場合

基本的にはIEnumerableを利用。IEnumerableの方がメモリ効率が良いため。

Listを使うのは下記のような場合。

  • 素数の取得をする
  • foreach文を2回以上通過する
  • 内部で配列やリストに変換している

メソッド戻り値

基本的にはListなどのより具体的なインタフェースで返す。呼び出し元での利便性を向上させるため。 無理にIEnumerableにしなくて良い。

詳細

基本的には以下の記事を参照。

qiita.com

IEnumerableは遅延評価がサポートされているため、「この変数は遅延評価に関する考慮が必要ですよ」というメッセージが込められることには注意。

ちなみにforeach文を2回以上通過する場合にイテレータが再評価される例は下記。

IEnumerable<int> GetNumbers()
{
    List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

    foreach (var number in numbers)
    {
        Console.WriteLine(number);
        yield return number;
    }
}

void Main()
{
    var numbers = GetNumbers();

    foreach (var number in numbers)
    {
        Console.WriteLine(number);
    }
}

このメソッドを実行すると以下のように表示される。

1
1
2
2
3
3
4
4
5
5

このように同じ要素が複数回処理され、効率の低下や予期しない結果につながるので注意が必要。