LINQ - Listeyi, Liste Olarak Değerle Sözlüğe Dönüştür


101

Bende var

List<MyObject> 

veritabanından aldığım. Ancak, gruplama amacıyla MyObject'teki bir özellik tarafından anahtarlanmasını isterim. LINQ ile listemi şunlara yayınlamanın en iyi yolu nedir:

Dictionary<long, List<MyObject>>

Aşağıdakilere sahibim:

myObjectList.ToDictionary(x => x.KeyedProperty)

Ama geri dönüyor:

Dictionary<long, MyObject>

Sözlüğün HANGİ MyObject özelliğine sahip olmasını istiyorsunuz? - bunların bir listesi var ....
James Curran

Yanıtlar:


194

Gruplandırmak istediğiniz gibi geliyor MyObjecttarafından örneklerini KeyedPropertyve içine gruplama koymak Dictionary<long,List<MyObject>>. Öyleyse aşağıdakileri deneyin

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

16

Sen kullanmalıdır ToLookupuzatma yöntemi üzerinde Enumerablesınıfının şöyle:

List<MyObject> list = ...;

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

Bunu bir sözlüğe yerleştirmek istiyorsanız, ToDictionaryuzantı yöntemini şu şekilde kullanabilirsiniz :

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

Bu ve kabul edilen cevap arasındaki fark nedir? ILookupReferanslar korunurken kabul edilen cevap korunmaz mı ?
PatPeter

@PatPeter Buradaki fikir, anahtar ile öğeler arasında bire çok ilişkiniz olduğunda, a'nın a'dan Lookup<TKey, TValue>daha iyi bir yapı olabileceğidir Dictionary<TKey, TValue>.
casperOne

1
@PatPeter ILookup'ın kullanmak için daha iyi bir yapı olduğunu söyleyebilirim (C ++ toplama algoritmalarını biliyorsanız, diktonerin haritasına benzer çoklu harita), ancak akılda tutulması gereken büyük bir faktör var - oluşturulan arama değişmez. Girişleri daha sonra ekleyemez veya kaldıramazsınız.
gbjbaanb

Diğer bir husus ise ILookup, çoğu zaman ideal kod içi yapı olmasına rağmen , genellikle serileştirme için iyi ele alınmamasıdır.
Jeff B
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.