[C#/LINQ] Repeatメソッドの使い方 – 指定要素を繰り返し生成する
C#のLINQにおけるEnumerable.Repeatメソッド
は、指定した要素を指定回数だけ繰り返し生成するために使用されます。
このメソッドは、同じ値を複数回持つシーケンスを簡単に作成する際に便利です。
構文はEnumerable.Repeat(TResult element, int count)
で、element
は繰り返す要素、count
は繰り返す回数を指定します。
例えば、Enumerable.Repeat(5, 3)
は5
を3回繰り返すシーケンス5, 5, 5
を生成します。
Repeatメソッドとは
C#のLINQ(Language Integrated Query)には、シーケンスを操作するための便利なメソッドが多数用意されています。
その中でも、Repeatメソッド
は特定の要素を指定した回数だけ繰り返して生成するためのメソッドです。
このメソッドを使用することで、同じ値を持つ要素のコレクションを簡単に作成することができます。
例えば、整数や文字列、オブジェクトなど、任意のデータ型を繰り返し生成することが可能です。
Repeatメソッド
は、主にデフォルト値を持つコレクションの初期化やテストデータの作成に役立ちます。
LINQの他のメソッドと組み合わせることで、より複雑なデータ操作を行うこともできます。
これにより、プログラムの可読性や保守性が向上します。
Repeatメソッドの基本的な使い方
簡単な例:整数を繰り返す
Repeatメソッド
を使って、整数を指定した回数だけ繰り返す例を見てみましょう。
以下のコードでは、整数5
を3
回繰り返して生成します。
using System;
using System.Linq;
class Program
{
static void Main()
{
var repeatedIntegers = Enumerable.Repeat(5, 3); // 整数5を3回繰り返す
foreach (var number in repeatedIntegers)
{
Console.WriteLine(number); // 繰り返された整数を出力
}
}
}
5
5
5
文字列を繰り返す例
次に、文字列を繰り返す例を見てみましょう。
以下のコードでは、文字列"Hello"
を4
回繰り返して生成します。
using System;
using System.Linq;
class Program
{
static void Main()
{
var repeatedStrings = Enumerable.Repeat("Hello", 4); // 文字列"Hello"を4回繰り返す
foreach (var str in repeatedStrings)
{
Console.WriteLine(str); // 繰り返された文字列を出力
}
}
}
Hello
Hello
Hello
Hello
オブジェクトを繰り返す例
Repeatメソッド
は、オブジェクトを繰り返すこともできます。
以下のコードでは、Personクラス
のインスタンスを2
回繰り返して生成します。
using System;
using System.Linq;
class Person
{
public string Name { get; set; }
}
class Program
{
static void Main()
{
var repeatedPersons = Enumerable.Repeat(new Person { Name = "Alice" }, 2); // Personオブジェクトを2回繰り返す
foreach (var person in repeatedPersons)
{
Console.WriteLine(person.Name); // 繰り返されたオブジェクトの名前を出力
}
}
}
Alice
Alice
繰り返し回数が0の場合の挙動
Repeatメソッド
において、繰り返し回数を0
に指定した場合、空のシーケンスが生成されます。
以下のコードを見てみましょう。
要素数: 0
このように、Repeatメソッド
は繰り返し回数が0
の場合には、要素を持たないシーケンスを返します。
Repeatメソッドの応用例
配列やリストの初期化に使用する
Repeatメソッド
は、配列やリストの初期化に非常に便利です。
例えば、特定の値で初期化された配列を作成することができます。
以下のコードでは、整数0
で初期化された配列を生成します。
using System;
using System.Linq;
class Program
{
static void Main()
{
var array = Enumerable.Repeat(0, 5).ToArray(); // 整数0を5回繰り返して配列を生成
Console.WriteLine(string.Join(", ", array)); // 配列の内容を出力
}
}
0, 0, 0, 0, 0
デフォルト値を持つコレクションの生成
コレクションをデフォルト値で初期化する際にもRepeatメソッド
が役立ちます。
以下の例では、null
で初期化されたリストを生成します。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var list = Enumerable.Repeat<string>(null, 3).ToList(); // nullを3回繰り返してリストを生成
Console.WriteLine($"要素数: {list.Count}"); // リストの要素数を出力
}
}
要素数: 3
テストデータの作成に利用する
Repeatメソッド
は、テストデータを作成する際にも非常に便利です。
例えば、特定の条件を満たすデータを簡単に生成できます。
以下のコードでは、テスト用のユーザー名を生成します。
using System;
using System.Linq;
class Program
{
static void Main()
{
var testUsernames = Enumerable.Repeat("TestUser", 5).ToArray(); // "TestUser"を5回繰り返して配列を生成
foreach (var username in testUsernames)
{
Console.WriteLine(username); // テスト用のユーザー名を出力
}
}
}
TestUser
TestUser
TestUser
TestUser
TestUser
繰り返し処理の簡略化
Repeatメソッド
を使用することで、繰り返し処理を簡略化できます。
例えば、特定の処理を複数回実行する場合に、Repeatメソッド
を使って簡潔に記述できます。
以下の例では、"Hello"
を3回出力します。
using System;
using System.Linq;
class Program
{
static void Main()
{
Enumerable.Repeat("Hello", 3) // "Hello"を3回繰り返す
.ToList()
.ForEach(Console.WriteLine); // 各要素を出力
}
}
Hello
Hello
Hello
このように、Repeatメソッド
を活用することで、さまざまな場面で効率的にデータを生成したり、処理を簡略化したりすることができます。
Repeatメソッドと他のLINQメソッドの組み合わせ
RepeatとSelectの組み合わせ
Repeatメソッド
とSelectメソッド
を組み合わせることで、繰り返された要素に対して変換処理を行うことができます。
以下の例では、整数1
を5
回繰り返し、それに2
を掛けた結果を生成します。
using System;
using System.Linq;
class Program
{
static void Main()
{
var result = Enumerable.Repeat(1, 5) // 整数1を5回繰り返す
.Select(x => x * 2); // 各要素に2を掛ける
foreach (var number in result)
{
Console.WriteLine(number); // 結果を出力
}
}
}
2
2
2
2
2
RepeatとWhereの組み合わせ
Repeatメソッド
とWhereメソッド
を組み合わせることで、特定の条件を満たす要素だけをフィルタリングすることができます。
以下の例では、整数5
を10
回繰り返し、その中から5
以上の要素を選択します。
using System;
using System.Linq;
class Program
{
static void Main()
{
var result = Enumerable.Repeat(5, 10) // 整数5を10回繰り返す
.Where(x => x >= 5); // 5以上の要素を選択
foreach (var number in result)
{
Console.WriteLine(number); // 結果を出力
}
}
}
5
5
5
5
5
5
5
5
5
5
RepeatとTakeの組み合わせ
Repeatメソッド
とTakeメソッド
を組み合わせることで、繰り返された要素の一部を取得することができます。
以下の例では、整数3
を10
回繰り返し、その中から最初の5
要素を取得します。
using System;
using System.Linq;
class Program
{
static void Main()
{
var result = Enumerable.Repeat(3, 10) // 整数3を10回繰り返す
.Take(5); // 最初の5要素を取得
foreach (var number in result)
{
Console.WriteLine(number); // 結果を出力
}
}
}
3
3
3
3
3
RepeatとToListの組み合わせ
Repeatメソッド
とToListメソッド
を組み合わせることで、繰り返された要素をリストとして取得することができます。
以下の例では、文字列"Repeat"
を4
回繰り返し、リストに変換します。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var result = Enumerable.Repeat("Repeat", 4) // 文字列"Repeat"を4回繰り返す
.ToList(); // リストに変換
foreach (var str in result)
{
Console.WriteLine(str); // 結果を出力
}
}
}
Repeat
Repeat
Repeat
Repeat
このように、Repeatメソッド
は他のLINQメソッド
と組み合わせることで、より柔軟で強力なデータ操作を実現できます。
Repeatメソッドの注意点
繰り返し回数が負の値の場合
Repeatメソッド
において、繰り返し回数を負の値に指定すると、ArgumentOutOfRangeException
がスローされます。
これは、繰り返し回数が無効であるためです。
以下のコードは、負の値を指定した場合の例です。
using System;
using System.Linq;
class Program
{
static void Main()
{
try
{
var result = Enumerable.Repeat(1, -3); // 繰り返し回数を-3に指定
}
catch (ArgumentOutOfRangeException ex)
{
Console.WriteLine($"エラー: {ex.Message}"); // エラーメッセージを出力
}
}
}
エラー: Specified argument was out of the range of valid values. (Parameter 'count')
大量の要素を生成する際のパフォーマンス
Repeatメソッド
を使用して大量の要素を生成する場合、パフォーマンスに影響を与えることがあります。
特に、非常に大きな数値を指定すると、メモリの使用量が増加し、アプリケーションのパフォーマンスが低下する可能性があります。
以下のコードは、非常に大きな繰り返し回数を指定した場合の例です。
using System;
using System.Linq;
class Program
{
static void Main()
{
var largeCount = 1000000; // 繰り返し回数を100万に設定
var result = Enumerable.Repeat(0, largeCount); // 大量の要素を生成
Console.WriteLine($"生成された要素数: {result.Count()}"); // 要素数を出力
}
}
生成された要素数: 1000000
このように、大量の要素を生成する際には、メモリ使用量やパフォーマンスに注意が必要です。
参照型オブジェクトの繰り返しにおける注意点
Repeatメソッド
を使用して参照型オブジェクトを繰り返す場合、同じインスタンスが複数回生成されることに注意が必要です。
以下の例では、Personクラス
のインスタンスを繰り返していますが、すべての要素が同じインスタンスを参照しています。
using System;
using System.Linq;
class Person
{
public string Name { get; set; }
}
class Program
{
static void Main()
{
var person = new Person { Name = "Alice" };
var repeatedPersons = Enumerable.Repeat(person, 3); // 同じインスタンスを3回繰り返す
foreach (var p in repeatedPersons)
{
Console.WriteLine(p.Name); // 名前を出力
}
// インスタンスの名前を変更
person.Name = "Bob";
// 変更後の名前を出力
foreach (var p in repeatedPersons)
{
Console.WriteLine(p.Name); // すべての要素が"Bob"になる
}
}
}
Alice
Alice
Alice
Bob
Bob
Bob
このように、参照型オブジェクトを繰り返す場合、同じインスタンスが参照されるため、意図しない変更が全ての要素に影響を与えることがあります。
新しいインスタンスを生成する場合は、Selectメソッド
などを使用して、各要素を個別に生成する必要があります。
まとめ
この記事では、C#のLINQにおけるRepeatメソッド
の基本的な使い方や応用例、他のLINQメソッド
との組み合わせ、注意点について詳しく解説しました。
特に、Repeatメソッド
は特定の要素を繰り返し生成するための便利なツールであり、データの初期化やテストデータの作成に役立ちます。
これを活用することで、プログラムの可読性や保守性を向上させることができるでしょう。
ぜひ、実際のプロジェクトや学習の中でRepeatメソッド
を試してみて、その効果を実感してみてください。