林克的表情.帮助模仿代码

And*_*rko 3 c# linq

请帮助最小化以下代码:有一个包含字典属性的类:

class Foo
{
    public int Field { get; set; }
    public Dictionary<int, bool> dic { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

还有一个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);
Run Code Online (Sandbox Code Playgroud)

是否可以使用纯LINQ方法执行此操作?先感谢您!

tza*_*man 6

您可以使用SelectMany抓取和展平内部字典元素:

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

编辑:如果你有勇气,可以通过从Jon Skeet的morelinq项目中选择DistinctBy方法来进一步改进.从本质上讲,这个步骤实际上是矫枉过正,因为我们真正想要的只是每个键的第一个值.如果我们只选择具有不同键的对,我们可以避免分组和后续调用,如下所示:GroupByFirst

var result = items.SelectMany(f => f.Dic)
                  .DistinctBy(pair => pair.Key)
                  .ToDictionary(pair => pair.Key, pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)