我有以下代码
new Dictionary<string,IEnumerable<Control>>()
{
{ "view1", new Control[] { contents, building, view1 }},
{ "view2", new Control[] { contents, view2 }},
{ "view3", new Control[] { building, view3 }
}
如何使用linq获取所有不同控件的列表?
结果应为:
{
contents,
building,
view2,
view3
}
答案 0 :(得分:6)
var controls = yourDictionary.SelectMany(pair => pair.Value).Distinct();
答案 1 :(得分:4)
这样的事情:
var distinct = dictionary.Values.SelectMany(x => x)
.Distinct();
尽管Marc拥有相同的答案,我仍然决定保留这个答案 - 看到这两种方法是有益的。在我的方法中,我们采用值序列 - 每个值都是IEnumerable<Control>
,并通过说“对于每个值,我们只想通过获取该值来获得IEnumerable<Control>
来展平它。”
Marc的方法采用键/值对的顺序,并且平坦化说:“对于每一对,我们希望通过获取该对的值来获得IEnumerable<Control>
。”
在这两种情况下,SelectMany
采用结果序列的序列,并将它们展平为单个序列 - 因此 Distinct()
调用之前的结果实际上是序列{ {1}}。 { contents, building, view1, contents, view2, building, view3 }
调用将生成序列Distinct
。
答案 2 :(得分:1)
var distinctControls = dictionary.Values.SelectMany(x=>x).Distinct();