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.