(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

5,6,7,8のような連番のListや配列をEnumerable.Rangeを使って簡単かつスマートに作る方法【C#】【LINQ】


このエントリーをはてなブックマークに追加



はじめに

C#で「5~8の連番のListが欲しい」みたいな時は素直にやると以下のような感じになるかと思います。

//5〜8の連番のListを作成
var list = new List<int>();
for (int i = 5; i <= 8; i++) {
  list.Add(i);
}


特にこれでも問題はないのですが、今回はもっと簡単かつスマートに実装する方法紹介です!

Enumerable.Range

LINQEnumerableにはRangeという

指定した範囲内の整数のシーケンスを生成するメソッドがあるので、今回はこれを使います。



使い方は簡単、連番の最初の数と連番の個数を入力するだけ。

ただし、IEnumerableで取得するので、

Listで欲しいときはToList、配列で欲しいときはToArrayで変換する必要があります。

using System.Linq; //EnumerableやToListを使うのに必要
//5から4つ分の連番(5,6,7,8)を作成
List<int> list = Enumerable.Range(5, 4).ToList();


このEnumerable.Rangeを使うだけでも最初の物よりは簡単かつスマートになってはいますが、

個人的には「5から8の連番を取得」みたいに指定出来たほうが

直感的で使い勝手が良い気がするので、以下のように専用のメソッドを作ってみました。

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

/// <summary>
/// Listの拡張クラス
/// </summary>
public static class ListExtension {

  /// <summary>
  /// startNo〜endNo(含む)の連番を順に含んだListを作成し取得
  /// </summary>
  public static List<int> GetSerialNoList(int startNo, int endNo) {
    if (startNo == endNo) {
      return new List<int>();
    }
    if (startNo > endNo) {
      return Enumerable.Range(endNo, startNo - endNo + 1).Reverse().ToList();
    }
    return Enumerable.Range(startNo, endNo - startNo + 1).ToList();
  }

}


使い方は以下のように連番の最初と最後の数字を指定するだけ。

//5〜8の連番(5,6,7,8)のListを作成
List<int> list = ListExtension.GetSerialNoList(5, 8);


なお、降順の連番も作成可能です。

//3〜-2の連番(3,2,1,0,-1,-2)のListを作成
List<int> list = ListExtension.GetSerialNoList(3, -2);