Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. Enumerable.Range() / Repeat() / Empty()

Enumerable.Range() / Repeat() / Empty()

シーケンスを静的に生成するための LINQ の静的メソッドです。連番・繰り返し・空シーケンスを手軽に作れます。

構文
using System.Linq;

// start から count 個の連続した整数のシーケンスを生成します。
IEnumerable<int> range = Enumerable.Range(start, count);

// element を count 回繰り返すシーケンスを生成します。
IEnumerable<T> repeated = Enumerable.Repeat(element, count);

// 要素が 0 件の空のシーケンスを生成します。
IEnumerable<T> empty = Enumerable.Empty<T>();
メソッド一覧
メソッド概要
Enumerable.Range(start, count)start から始まる count 個の連続整数のシーケンスを返します。
Enumerable.Repeat(element, count)指定した要素を count 回繰り返すシーケンスを返します。
Enumerable.Empty<T>()要素が 0 件の空のシーケンスを返します。型だけ一致する空の列挙が必要なときに使います。
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;

// 1〜10 の連番を生成します。
IEnumerable<int> range = Enumerable.Range(1, 10);
Console.WriteLine(string.Join(", ", range)); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

// 0〜9 の連番で偶数だけ取得します(Range + Where の組み合わせ)。
IEnumerable<int> evens = Enumerable.Range(0, 10).Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", evens)); // 0, 2, 4, 6, 8

// Range + Select で 2 のべき乗を生成します。
IEnumerable<int> powers = Enumerable.Range(0, 8).Select(n => (int)Math.Pow(2, n));
Console.WriteLine(string.Join(", ", powers)); // 1, 2, 4, 8, 16, 32, 64, 128

// Repeat: 同じ値を 5 回繰り返します。
IEnumerable<string> hellos = Enumerable.Repeat("Hello", 5);
Console.WriteLine(string.Join(", ", hellos)); // Hello, Hello, Hello, Hello, Hello

// Repeat: 初期値 0 で埋めたリストを生成します。
List<int> zeros = Enumerable.Repeat(0, 10).ToList();
Console.WriteLine(zeros.Count); // 10

// Empty: 型が一致する空シーケンスを返します(null の代わりに使えます)。
IEnumerable<string> empty = Enumerable.Empty<string>();
Console.WriteLine(empty.Any()); // false

// メソッドの戻り値として空シーケンスを返す例
IEnumerable<int> GetNumbers(bool flag) =>
    flag ? Enumerable.Range(1, 5) : Enumerable.Empty<int>();

Console.WriteLine(string.Join(", ", GetNumbers(true)));  // 1, 2, 3, 4, 5
Console.WriteLine(string.Join(", ", GetNumbers(false))); // (空)
概要

『Enumerable.Range()』は遅延評価のため、大きな連番を生成してもメモリを一度に消費しません。対して『ToList()』で実体化すると全要素がメモリに展開されます。

『Enumerable.Range()』の第 2 引数は「開始値からの件数」であり「終了値」ではありません。例えば 1〜10 を生成するには『Range(1, 10)』と書きます(Range(1, 11) は誤りです)。

生成したシーケンスは他の LINQ メソッドと組み合わせて使えます。変換には『Enumerable.Select()』を、絞り込みには『Enumerable.Where()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。