2013-10-22 26 views
8

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:

+1

Bir oluşturmaya çalışıyorsunuz Bir sözlükten arama mı? Durum buysa, ToLookup() uzantı yöntemi arkadaşınızdır. – Baldrick

+1

@B ... Bunu anlamaya çalıştım ama başımı tüm parametreler ve aşırı yüklenmelerle GroupBy yönteminin üzerine alamadım. – sidon

+0

Just 'var byLookup = actions.ToLookup (pair => pair.Value, pair => pair.Key)' yeterlidir, bunun için ToDictionary'a gerçekten aramanıza gerek yoktur. –

cevap

23

Bu oldukça basit bir LINQ ifadesidir. Bu, anahtar olarak dizeleri ve öğeleri olarak KeyValuePair<int,string> grupları oluşturur.

Sonra Sözlük anahtarı için o grubun anahtarı kullanarak bir sözlüğe grupları dönüştürmek ve ToList() ile bir liste halinde orijinal sözlüğün anahtarlarını "düzleşme".

+0

Yardımlarınız için teşekkürler. Sorumu güncelledim, lütfen bir göz atabilir misiniz? – sidon

+0

@sidon Gösterdiğiniz iki yaklaşım hemen hemen aynı, çünkü sonunda bir sözlük olsun. Asla '' Listeden '' ('' AsEnumerable '') 'ı terk etmemelisiniz, ancak sözlükteki listeleri bir kereden fazla numaralandırmayacağınızdan emin değilseniz. – dasblinkenlight

+0

@sidon Bir sözlük nesnesi yerine bir arama nesnesi olması kabul edilirse, ToDictionary'u tamamen atlayabilirsiniz. – dasblinkenlight

3

şöyle Ayrıca gerekli sonucu alabilirsiniz: Bu dasblinkenlight aynı sonucu verir ama fıkra ile gruba KeyValuePair eşleştirmesini hamle

var result = source 
    .GroupBy(x => x.Value, x => x.Key) 
    .ToDictionary(g => g.Key, g => g.ToList()); 

İlgili konular