Apakah mungkin untuk mengubah dua atau lebih daftar menjadi satu daftar tunggal, dalam .NET menggunakan C #?
Sebagai contoh,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
AddRange
-Metode?Jawaban:
Anda dapat menggunakan LINQ
Concat
danToList
metode:Perhatikan bahwa ada cara yang lebih efisien untuk melakukan ini - yang di atas pada dasarnya akan melewati semua entri, membuat buffer berukuran dinamis. Karena Anda dapat memprediksi ukuran untuk memulai, Anda tidak perlu ukuran dinamis ini ... sehingga Anda dapat menggunakan:
(
AddRange
dikurung khususICollection<T>
untuk efisiensi.)Saya tidak akan mengambil pendekatan ini kecuali Anda benar-benar harus melakukannya.
sumber
productCollection1.ForEach(p => allProducts.Add(p))
lebih berkinerja daripada AddRange.AddRange
akan melakukan copy blok dari satu array yang mendasarinya. Apakah Anda memiliki tautan untuk bukti ini?productionCollection1.ForEach(...)
lebih berkinerja daripada AddRange". Performa sangat jarang sehingga mudah digambarkan. Aku sedang terkejut bahwa AddRange tidak pemukulan itu dgn mudah meskipun - saya perlu untuk menyelidiki yang lebih lanjut.AddRange
merupakan pilihan terbaik untuk kecepatan mentah (sekitar 4x dan semakin besar daftar semakin baik peningkatan), seperti Jon sugesti.Dengan asumsi Anda menginginkan daftar yang berisi semua produk untuk kategori-Id yang ditentukan, Anda dapat memperlakukan kueri Anda sebagai proyeksi diikuti oleh operasi perataan . Ada operator LINQ yang melakukan itu:
SelectMany
.Di C # 4, Anda dapat mempersingkat SelectMany ke:
.SelectMany(GetAllProducts)
Jika Anda sudah memiliki daftar yang mewakili produk untuk setiap Id, maka yang Anda butuhkan adalah gabungan , seperti yang ditunjukkan orang lain.
sumber
Anda bisa menggabungkannya menggunakan LINQ:
pendekatan penggunaan yang lebih tradisional
List.AddRange()
mungkin lebih efisien.sumber
Lihat List.AddRange untuk menggabungkan Daftar
sumber
Anda dapat menggunakan metode ekstensi Concat :
sumber
sumber
Saya tahu ini adalah pertanyaan lama yang saya pikir mungkin saya tambahkan 2 sen saja.
Jika sudah punya,
List<Something>[]
Anda bisa bergabung dengan mereka menggunakanAggregate
Semoga ini membantu.
sumber
Saya sudah berkomentar tapi saya masih berpikir itu pilihan yang valid, hanya menguji apakah di lingkungan Anda lebih baik satu solusi atau yang lain. Dalam kasus khusus saya, menggunakan
source.ForEach(p => dest.Add(p))
berkinerja lebih baik daripada yang klasikAddRange
tapi saya belum menyelidiki mengapa di level rendah.Anda dapat melihat contoh kode di sini: https://gist.github.com/mcliment/4690433
Jadi opsinya adalah:
Uji untuk mengetahui apakah itu cocok untuk Anda.
Penafian : Saya tidak menganjurkan solusi ini, saya menemukan
Concat
yang paling jelas. Saya baru saja menyatakan - dalam diskusi saya dengan Jon - bahwa di mesin saya kasus ini berkinerja lebih baik daripadaAddRange
, tetapi dia mengatakan, dengan pengetahuan yang jauh lebih banyak daripada saya, bahwa ini tidak masuk akal. Ada intinya jika Anda ingin membandingkan.sumber
var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();
yang menambahkannya ke GridView tetapi sebagai satu kolom. Saya ingin membaginya menjadi tiga kolom terpisah.Dengan cara ini adalah Daftar multi dimensi dan .SelectMany () akan meratakannya menjadi produk IEnumerable maka saya menggunakan metode .ToList () setelahnya.
sumber
Untuk menggabungkan atau Menggabungkan ke Daftar ke dalam daftar Satu.
Ada satu hal yang pasti benar: jenis kedua daftar akan sama.
Sebagai Contoh : jika kita memiliki daftar
string
sehingga kita dapat menambahkan tambahkan daftar lain ke daftar yang ada yang memiliki daftar tipe string kalau tidak kita tidak bisa.Contoh :
sumber
Dalam kasus khusus: "Semua elemen List1 menuju ke List2 baru": (mis. Daftar string)
Dalam hal ini, list2 dihasilkan dengan semua elemen dari list1.
sumber
Anda perlu menggunakan operasi Concat
sumber
Ketika Anda memiliki beberapa daftar tetapi Anda tidak tahu berapa tepatnya, gunakan ini:
listsOfProducts
berisi beberapa daftar berisi objek.sumber