テストデータの作成や、ドロップダウンリストの選択肢(年、月、日など)を生成する際、連続した数値のコレクションが必要になることがあります。forループを使用してリストに追加していく方法も可能ですが、C#のLINQに含まれるEnumerable.Rangeメソッドを使用すると、より簡潔で宣言的なコード記述が可能です。
今回は、カレンダー機能やドロップダウン作成を想定した「指定範囲の西暦リスト」の生成を題材に、Rangeメソッドの正しい使い方と注意点を解説します。
Enumerable.Rangeメソッドの概要
Enumerable.Rangeは、指定した開始数値から、指定した個数分の整数シーケンス(IEnumerable<int>)を生成する静的メソッドです。
構文は以下の通りです。
Enumerable.Range(int start, int count)
重要な注意点: 第2引数は「終了する値」ではなく、**「生成する個数」**です。ここを混同しないように注意が必要です。
実践的なコード例:直近の西暦リスト生成
以下のコードは、指定した開始年から10年分の西暦リストを生成する例です。Webフォームの「年」を選択するドロップダウンなどのデータソースとして利用できるシナリオです。
using System;
using System.Collections.Generic;
using System.Linq;
namespace CalendarUtilities
{
class Program
{
static void Main()
{
// シナリオ:
// ユーザー登録フォームなどで使用する「年」の選択肢データを作りたい。
// 2020年から始まり、向こう10年分のリスト(2020~2029)が必要。
int startYear = 2020;
int count = 10;
// 1. Enumerable.Rangeを使用して連番を生成
// startYear(2020) から count(10)個 の数値を生成します。
// 結果: 2020, 2021, 2022, ..., 2029
IEnumerable<int> yearList = Enumerable.Range(startYear, count);
// 結果の出力
Console.WriteLine($"--- 西暦リスト ({startYear}年から{count}年分) ---");
Console.WriteLine(string.Join(", ", yearList));
// 2. (応用) Selectと組み合わせて文字列フォーマットする
// 数値そのものではなく、"2020年" のような文字列リストに変換する場合
var formattedYears = Enumerable.Range(startYear, count)
.Select(y => $"{y}年");
Console.WriteLine("\n--- フォーマット済みリスト ---");
Console.WriteLine(string.Join(" | ", formattedYears));
}
}
}
実行結果
--- 西暦リスト (2020年から10年分) ---
2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029
--- フォーマット済みリスト ---
2020年 | 2021年 | 2022年 | 2023年 | 2024年 | 2025年 | 2026年 | 2027年 | 2028年 | 2029年
技術的なポイントと応用
1. 引数の範囲制限
Enumerable.Rangeの引数はint型です。生成される数値がint.MaxValueを超える場合(例えば start + count - 1 がオーバーフローする場合)、実行時にArgumentOutOfRangeExceptionが発生します。非常に大きな数値を扱う場合は、long型で独自のジェネレータを実装する必要があります。
2. 繰り返し処理の回数指定として利用する
Rangeは単なる数値リストの生成だけでなく、「特定の回数だけ処理を繰り返したい」という場合にも利用できます。foreachループやLINQの起点として便利です。
// 5回繰り返してオブジェクトを生成する例
var newItems = Enumerable.Range(1, 5).Select(i => new Item { Id = i, Name = $"Item-{i}" });
3. Repeatメソッドとの違い
類似のメソッドにEnumerable.Repeatがあります。
- Range:
1, 2, 3...と変化する連番を生成します。 - Repeat:
1, 1, 1...と同じ値を指定回数繰り返します。
初期値で埋められた配列を作りたい場合はRepeat、インデックスや連番が必要な場合はRangeを選択してください。
まとめ
Enumerable.Rangeメソッドを使用することで、数値のシーケンス生成をわずか1行で記述できます。第2引数が「終了値」ではなく「個数」であることを理解していれば、ページネーション、カレンダー、テストデータの生成など、多岐にわたる場面で活用できる基本的なテクニックです。
