LINQ

[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メソッドを使って、整数を指定した回数だけ繰り返す例を見てみましょう。

以下のコードでは、整数53回繰り返して生成します。

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メソッドを組み合わせることで、繰り返された要素に対して変換処理を行うことができます。

以下の例では、整数15回繰り返し、それに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メソッドを組み合わせることで、特定の条件を満たす要素だけをフィルタリングすることができます。

以下の例では、整数510回繰り返し、その中から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メソッドを組み合わせることで、繰り返された要素の一部を取得することができます。

以下の例では、整数310回繰り返し、その中から最初の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メソッドを試してみて、その効果を実感してみてください。

関連記事

Back to top button