如何选择另一个列表中包含的不同元素列表?

时间:2010-08-03 10:17:52

标签: c# linq

我有以下代码

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
}

3 个答案:

答案 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();