【C#】LINQのRangeメソッドで連番や指定範囲の数値リストを生成する

テストデータの作成や、ドロップダウンリストの選択肢(年、月、日など)を生成する際、連続した数値のコレクションが必要になることがあります。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引数が「終了値」ではなく「個数」であることを理解していれば、ページネーション、カレンダー、テストデータの生成など、多岐にわたる場面で活用できる基本的なテクニックです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次