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


201

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

それを行うための.Netの組み込みメソッドはありますか、それとも自分で書く必要がありますか?


9
code.msdn.microsoft.com/101-LINQ-Samples-3fb9811bをブックマークすることをお勧めします。
Cポンドの達人

回答:


332

はい、LINQ to ObjectsはこれをEnumerable.Concat次のようにサポートしています:

var together = first.Concat(second);

NB:万一firstまたはsecondあなたが受け取ることになるnullになりますArgumentNullException。これを回避し、空のセットと同様にnullを処理するには、次のようにnull結合演算子を使用します。

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

1
txという拡張メソッドの検索はいつも忘れます。
Samuel Rossille 2013年

10
@SamuelRossilleまた、実行したいアクションの名前が、自分が何をしているのか正確に呼ばれていなければ、近い可能性が高いことを忘れないでください。常にIntelliSenseを参照してください。たくさん学ぶことができます。
アダムホールズワース2014年

3
second = first.Concat(second)を実行するのは悪いことですか?同時実行の問題はありますか?
user2934433

4
@ user2934433:いいえ、それで十分です。
ジョンスキート2017年

2
簡単なメモ。using System.Linq IDEインテリセンスで目的の拡張メソッドを表示するには、コードファイルの先頭に名前空間をインポートする必要があります。
RBT

19

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

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


7

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

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); 
    } 
}

0
// The answer that 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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.