LINQ - Ubah Daftar ke Kamus dengan Nilai sebagai Daftar


99

Saya punya

List<MyObject> 

yang saya ambil dari database. Namun, saya ingin memasukkan properti di MyObject untuk tujuan pengelompokan. Apa cara terbaik dengan LINQ untuk memasukkan daftar saya ke:

Dictionary<long, List<MyObject>>

Saya memiliki yang berikut ini:

myObjectList.ToDictionary(x => x.KeyedProperty)

Tapi itu kembali:

Dictionary<long, MyObject>

Anda ingin kamus dikunci ke properti WHICH MyObject? - Anda memiliki daftar lengkap ....
— James Curran

Jawaban:


192

Sepertinya Anda ingin mengelompokkan MyObjectinstance KeyedPropertydan memasukkan pengelompokan itu ke dalam Dictionary<long,List<MyObject>>. Jika demikian, coba yang berikut ini

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());

16

Anda harus menggunakan ToLookupmetode ekstensi di Enumerablekelas seperti ini:

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

Jika Anda ingin menempatkannya di kamus, maka Anda dapat menggunakan ToDictionarymetode ekstensi , seperti:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

Apa perbedaan antara ini dan jawaban yang diterima? Apakah ILookupreferensi tersebut menyimpan sedangkan jawaban yang diterima tidak?
— PatPeter

@PatPeter Idenya adalah bahwa ketika Anda memiliki hubungan satu-ke-banyak antara kunci dan item, a Lookup<TKey, TValue>mungkin merupakan struktur yang lebih baik daripada a Dictionary<TKey, TValue>.
— casperOne

1
@PatPeter saya akan mengatakan ILookup adalah struktur yang lebih baik untuk digunakan (seperti multimap ke peta dictonary, jika Anda tahu algoritma pengumpulan C ++) tetapi memiliki satu faktor besar untuk diingat - pencarian yang dibuat tidak dapat diubah. Anda tidak dapat menambah atau menghapus entri setelahnya.
— gbjbaanb

Pertimbangan lainnya adalah bahwa meskipun ILookupseringkali merupakan struktur dalam kode yang ideal, seringkali tidak ditangani dengan baik untuk serialisasi.
— Jeff B
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.