Sözlüğün anahtarlarını ve değerlerini tersine çevirmek istiyorum. I.e kaynak sözlükten Dictionary<int, string>
, ben Dictionary<string, List<int>>
almak istiyorum. List<int>
var çünkü değer, farklı anahtarlar altında kaynak sözlükte birden çok kez olabilir.Sözlük'te ters anahtar ve değer
Örnek: Yardım için
{
"A": [1,2,3]
"B": [4,5]
"C": [6]
"D": [7]
}
teşekkür:
{
1: "A"
2: "A"
3: "A"
4: "B"
5: "B"
6: "C"
7: "D"
}
için dönüştürecektir.
DÜZENLEME:
Tamam, bu algoritma hakkında biraz anlamak mümkün oldu Sizlerden yardımıyla. Şimdi iki olası çözümü (diğerlerinin yanı sıra) görüyorum ve sonuçların aynı olduğu için aralarındaki gerçek farkın ne olduğunu bilmiyorum.
Herhangi bir performans sorunu var mı?
var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key)
.ToDictionary(group => group.Key, group => group.AsEnumerable());
var byGroupBy = actions.GroupBy(pair => pair.Value, pair => pair.Key)
.ToDictionary(group => group.Key, group => group.AsEnumerable());
DÜZENLEME 2:
Ben bu basit olurdu beklenen olmadı sadece
var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key)
kullanarak sona erdi. Hepinize teşekkürler.
var res = dict
.GroupBy(p => p.Value)
.ToDictionary(g => g.Key, g => g.Select(pp => pp.Key).ToList());
İlk olarak, grup değerine göre:
Bir oluşturmaya çalışıyorsunuz Bir sözlükten arama mı? Durum buysa, ToLookup() uzantı yöntemi arkadaşınızdır. – Baldrick
@B ... Bunu anlamaya çalıştım ama başımı tüm parametreler ve aşırı yüklenmelerle GroupBy yönteminin üzerine alamadım. – sidon
Just 'var byLookup = actions.ToLookup (pair => pair.Value, pair => pair.Key)' yeterlidir, bunun için ToDictionary'a gerçekten aramanıza gerek yoktur. –