はじめに
C#で「5~8の連番のListが欲しい」みたいな時は素直にやると以下のような感じになるかと思います。
//5〜8の連番のListを作成 var list = new List<int>(); for (int i = 5; i <= 8; i++) { list.Add(i); }
特にこれでも問題はないのですが、今回はもっと簡単かつスマートに実装する方法紹介です!
Enumerable.Range
LINQのEnumerableには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);