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?
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?
Jawaban:
Ya, LINQ to Objects mendukung ini dengan Enumerable.Concat
:
var together = first.Concat(second);
NB: Jika first
atau second
nol 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
using System.Linq
namespace di bagian atas file kode untuk melihat metode ekstensi yang diinginkan dalam intellisense IDE.
The Concat
Metode 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 Cat
dan 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.
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);
}
}
// 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);
}