web-dev-qa-db-ja.com

2つのIEnumerable <T>を新しいIEnumerable <T>に連結する方法は?

IEnumerable<T>の2つのインスタンスがあります(同じTを使用)。両方を連結したIEnumerable<T>の新しいインスタンスが必要です。

それを行うための.Netのビルドインメソッドはありますか、自分で作成する必要がありますか?

156
Samuel Rossille

はい、LINQ to Objectsはこれを Enumerable.Concat でサポートしています。

var together = first.Concat(second);

注意:firstまたはsecondがnullの場合、ArgumentNullExceptionを受け取ります。これを回避し、空のセットと同様にヌルを処理するには、次のようにヌル合体演算子を使用します。

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
265
Jon Skeet

Concatメソッドは、渡された2つの列挙可能な項目(AおよびB)を順番に使用しようとする列挙子を持つオブジェクト(Catと呼びます)を返すことにより、IEnumerable<T>を実装するオブジェクトを返します。渡された列挙型が、Catの存続期間中に変化せず、副作用なしで読み取ることができるシーケンスを表す場合、Catを直接使用できます。そうでない場合は、CatToList()を呼び出し、結果のList<T>(AおよびBの内容のスナップショットを表す)を使用することをお勧めします。

一部の列挙型は、列挙の開始時にスナップショットを取得し、列挙中にコレクションが変更された場合、そのスナップショットからデータを返します。 Bがそのような列挙型である場合、CatがAの最後に到達する前に発生するBへの変更はCatの列挙に表示されますが、その後に発生する変更は表示されません。このようなセマンティクスは混乱を招く可能性があります。 Catのスナップショットを取ることで、このような問題を回避できます。

16
supercat

あなたのソリューションに以下のコードを使用できます:-

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
        Console.WriteLine(n); 
    } 
}
6
Jay Shukla
//The answare i was looking for when searching
public void Answer()
{
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList();
    //Assign to empty list so we can use later
    IEnumerable<YourClass> second = new List<YourClass>();

    if (IwantToUseSecondList)
    {
        second = this.GetSecondIEnumerableList();  
    }
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second);
}
0
Hasse