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>
Brandon
sumber
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());
JaredPar
sumber
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);
casperOne
sumber
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