请帮助最小化以下代码:有一个包含字典属性的类:
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方法执行此操作?先感谢您!
您可以使用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)