Bagaimana menggabungkan dua IEnumerable <T> menjadi IEnumerable <T> baru?

201

Saya memiliki dua contoh IEnumerable<T>(dengan yang sama T). Saya ingin contoh baru IEnumerable<T>yang merupakan gabungan dari keduanya.

Apakah ada metode built-in di. Net untuk melakukan itu atau saya harus menulis sendiri?

Samuel Rossille
sumber
9
Anda mungkin ingin mem-bookmark code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b .
C-Pound Guru

Jawaban:

332

Ya, LINQ to Objects mendukung ini dengan Enumerable.Concat:

var together = first.Concat(second);

NB: Jika firstatau secondnol Anda akan menerima a ArgumentNullException. Untuk menghindari ini & memperlakukan null seperti yang Anda lakukan pada set kosong, gunakan operator penggabungan nol seperti:

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
Jon Skeet
sumber
1
Saya selalu lupa mencari metode ekstensi, tx.
Samuel Rossille
10
@SamuelRossille Juga jangan lupa bahwa nama-nama tindakan yang ingin Anda lakukan cenderung dekat jika tidak persis disebut apa yang Anda cari. Selalu telusuri IntelliSense, Anda banyak belajar.
Adam Houldsworth
3
Apakah buruk melakukan second = first.Compat (second)? akankah kita memiliki masalah konkurensi?
user2934433
4
@ user2934433: Tidak, tidak apa-apa.
Jon Skeet
2
Hanya catatan singkat. Diperlukan untuk mengimpor using System.Linq namespace di bagian atas file kode untuk melihat metode ekstensi yang diinginkan dalam intellisense IDE.
RBT
19

The ConcatMetode akan kembali objek yang mengimplementasikan IEnumerable<T>dengan mengembalikan sebuah objek (menyebutnya Cat) yang pencacah akan mencoba untuk menggunakan dua melewati-in item enumerable (menyebut mereka A dan B) secara berurutan. Jika enumerables yang lewat mewakili urutan yang tidak akan berubah selama masa hidup Cat, dan yang dapat dibaca dari tanpa efek samping, maka Cat dapat digunakan secara langsung. Jika tidak, mungkin ide yang baik untuk menelepon ToList()pada Catdan menggunakan dihasilkan tersebut List<T>(yang akan mewakili snapshot dari isi A dan B).

Beberapa enumerables mengambil snapshot ketika enumerasi dimulai, dan akan mengembalikan data dari snapshot itu jika koleksi diubah selama enumerasi. Jika B adalah enumerable, maka perubahan apa pun ke B yang terjadi sebelum Cat mencapai akhir A akan muncul dalam enumerasi Cat, tetapi perubahan yang terjadi setelah itu tidak akan terjadi. Semantik seperti itu mungkin membingungkan; mengambil snapshot Cat dapat menghindari masalah seperti itu.

supercat
sumber
7

Anda dapat menggunakan kode di bawah ini untuk solusi Anda: -

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); 
    } 
}
Jay Shukla
sumber
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);
}
Hasse
sumber