如何从c#中的列表列表中获取不同的元素

时间:2015-12-16 13:13:59

标签: c# linq list

我有一个列表列表,其中子列表是字符串列表。我期待的结果是所有不同字符串的列表。 例如:

var listoflist = new List<List<string>> { new List<string> { "A", "B", "C" },
                                          new List<string> { "A", "B", "D", "E" } };

对于上面的列表,我希望输出为{“A”,“B”,“C”,“D”,“E”}

这是我找到的解决方案,但我觉得它不是一个有效的解决方案。请提供你的理解。

var listoflist = new List<List<string>> { new List<string> { "A", "B", "C" },
                                          new List<string> { "A", "B", "D", "E" } };

List<string> distinctList = new List<string>();
listoflist.ForEach(list =>
{
    distinctList.AddRange(list);
});

distinctList = distinctList.Distinct().ToList();

5 个答案:

答案 0 :(得分:8)

您可以使用Enumerable.SelectMany展平列表:

var list = listoflist.SelectMany(x => x).Distinct();

如果您想要实现查询并获得List<string>,请添加ToList()

答案 1 :(得分:3)

下面,

[TestClass]
public class Class1
{
    [TestMethod]
    public void test()
    {
        var listoflist = new List<List<string>>
        {
            new List<string> {"A", "B", "C"},
            new List<string> {"A", "B", "D", "E"}
        };
        var result = listoflist.SelectMany(l=>l).Distinct().ToList();
        Assert.AreEqual(result.Count, 5);
    }
}

答案 2 :(得分:2)

使用SelectMany: -

var res = listoflist.SelectMany(x => x).Distinct();

SelectMany将展平您可以应用Distinct方法的列表。它将返回IEnumerable<string>。如果您想要List<string>作为输出,那么只需应用ToList即可实现结果: -

List<string> distinctList = listoflist.SelectMany(x => x).Distinct().ToList();

答案 3 :(得分:2)

listofList.SelectMany().Distinct()

答案 4 :(得分:2)

我会用,

var distinctValues= listoflist[0].Concat(listoflist[1]).GroupBy(a=>a).Select(x => x.First());

此处,first将选择第一条记录,groupBy将分组相同的值