2010-06-30 62 views
3

請,幫助減少下面的代碼: 沒有與字典屬性的類:Linq表達式。幫助mimize代碼

class Foo 
{ 
    public int Field { get; set; } 
    public Dictionary<int, bool> dic { get; set; } 
} 

和Foo實例的列表。我想美國從字典一樣,所有的類實例:

...

var items = new List<Foo> 
    { 
     new Foo {Field = 1, Dic = new Dictionary<int, bool> {{1, true}, {2, false}}}, 
     new Foo {Field = 2, Dic = new Dictionary<int, bool> {{3, true}, {2, false}}} 
    }; 
    var result = new Dictionary<int, bool>(); 

    foreach (var dics in items.Select(x => x.Dic)) 
     foreach (var pair in dics) 
      if (!result.ContainsKey(pair.Key)) 
       result.Add(pair.Key, pair.Value); 

    // testing output 
    foreach (var pair in result) 
     Console.WriteLine("{0}, {1}", pair.Key, pair.Value); 

是否有可能與純LINQ的方法來做到這一點? 提前謝謝!

回答

6

您可以使用SelectMany抓住和扁平內字典元素:

var result = items.SelectMany(f => f.Dic) 
        .GroupBy(pair => pair.Key) 
        .ToDictionary(g => g.Key, g => g.First().Value); 

編輯:如果你感覺勇敢,這可以進一步通過拿起DistinctBy方法改進來自Jon Skeet的morelinq項目。從本質上講,GroupBy步驟實際上是過度的,因爲我們真正想要的是每個鍵的第一個值。如果我們只選擇與不同的鍵對,我們能夠避免的分組和後續First通話,就像這樣:

var result = items.SelectMany(f => f.Dic) 
        .DistinctBy(pair => pair.Key) 
        .ToDictionary(pair => pair.Key, pair => pair.Value); 
+0

謝謝你:是的SelectMany有力的方法我也不知道:) – 2010-06-30 12:17:53

+0

我其實是有這個打完了,和我回來的時候它被張貼>! – Nix 2010-06-30 12:19:27

+0

是的,它非常強大。每個LINQ函數實際上可以由SelectMany實現:) – 2010-06-30 12:20:43

2
var result = 
    (from item in items 
    from pair in item.Dic 
    group pair by pair.Key 
    ).ToDictionary(g => g.Key, g => g.First().Value); 
1

我不知道,如果Distinct是更好,但它是短寫。

var result = items.SelectMany(d => d.Dic) 
        .Distinct() 
        .ToDictionary(p => p.Key, p => p.Value); 

但我其實有點像使用foreach爲此。

var result = new Dictionary<int, bool>(); 

foreach (var dic in items.SelectMany(d => d.Dic)) 
    result[dic.Key] = dic.Value;