LINQ ile bir Sözlük <T1, T2> seçin


171

IEnumerable<T>LINQ ile dönmek için "select" anahtar kelime ve uzantısı yöntemini kullandım , ancak bir genel dönmek için bir ihtiyaç var Dictionary<T1, T2>ve anlayamıyorum. Bunu öğrendiğim örnek aşağıdakine benzer bir biçimde kullanıldı:

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 };

Aynı şeyi uzantı yöntemleriyle de yaptım. Ben bir yukarıdaki öğeleri sadece " " ile yukarıdaki örnekte "SomeClass" yerine Dictionary<T1, T2>olabilir gibi yinelenebilir beri , ancak bu işe yaramadı (Anahtar ve Değer salt okunur olarak işaretlendi, bu yüzden bu kodu derlemek olamazdı ).KeyValuePair<T1, T2>new KeyValuePair<T1, T2> { ...

Bu mümkün mü, yoksa bunu birkaç adımda yapmam gerekiyor mu?

Teşekkürler.

Yanıtlar:


284

Uzantı yöntemleri ayrıca bir ToDictionary uzantısı da sağlar . Kullanımı oldukça basittir, genel kullanım anahtar için bir lambda seçiciyi geçip nesneyi değer olarak almaktır, ancak hem anahtar hem de değer için bir lambda seçicisini iletebilirsiniz.

class SomeObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

SomeObject[] objects = new SomeObject[]
{
    new SomeObject { ID = 1, Name = "Hello" },
    new SomeObject { ID = 2, Name = "World" }
};

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);

Sonra objectDictionary[1]"Merhaba" değerini içerir


44
var dictionary = (from x in y 
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

Yani varsayarak oluyor SomeClass.prop1istenilen olan Keysözlük için.


27
.ToDictionary(item => item.prop1, item => item.prop2);açıklık için de değeri ayarlayın.
finoutlook

42

Bir koleksiyon KeyValuePairdaha açıktır ve çok iyi çalışır.

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);

.ToDictionary (x => x.Key, x => x.Value); yeni KeyValuePair yerine Yeni Sözlük?
Amir Hajiha

@ AmirNo-Family Yanlış düşünüyorsun. Nesne koleksiyonunun her öğesi için bir projeksiyon gerçekleştirmek üzere (x => x ...) yöntemini seçin . Dolayısıyla, yeni KeyValuePair'in yerine yeni sözlükler koymak sözlükler sözlüğü oluşturacaktır. Ben bunu hedeflediğinizi sanmıyorum.
Antoine Meltzheim

Ben Sözlük <string, string> bir listesi var ve üzerlerinde select kullanmaya çalışıyordu ama bir derleme hatası atar.
Amir Hajiha
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.