如何在C#中合并List<List<String>>?

11

我有一个List<List<String>>,其中包含

{  {"A" , "B" }, 
   {"C" , "D" }
}

我需要将所有的内部列表合并到另一个列表中。

因此,得到的List<String>将包含:

     {"A","B","C","D"}

现在我正在使用for循环来做这件事

有没有使用LINQLambda表达式来完成这个任务的方法。

请帮助我完成这个任务。

提前致谢。


1
如果您的列表中有重复项怎么办? - Gabe
在列表中执行并集操作将丢弃重复项。 - Thorin Oakenshield
6个回答

14
List<List<string>> collections = new List<List<string>>()
        {
          new List<string>(){"A" , "B" }, 
          new List<string>() {"C" , "D" }
        };

var list = collections.SelectMany(x => x).ToList();

SelectMany创建一个表达式树,该树在求值时将列表的列表展平为一个组合成员的单个列表。

ToList强制表达式树被求值,并导致生成一个List。

如果想要消除重复项,可以在调用'ToList()'之前添加Distinct调用。


14

虽然不完全是 Union 操作,但你可以尝试这个方法

YourList.SelectMany(l=>l).Distinct()

3
实际上,Union 就是 Concat().Distinct()。因为这是一个列表中的列表,所以你需要使用 SelectMany 而不是 Concat。换句话说,这是我在这里看到的唯一正确的答案。其他答案都忽略了可能存在重复项的情况,而提问者想要去除重复项的 Union。 - Brian Genisio
.NET框架在BCL中是否提供了身份函数?Haskell和Scala都有它(在Ruby中,我总是自己添加它),这使得像这样的代码更容易阅读。在Ruby中,以上大致为your_list.flat_map {|l| l }.uniq,但使用以下定义IDENTITY = -> x { x }可以编写为your_list.flat_map(&IDENTITY)。在Scala中,它将是yourList flatMap identity,在Haskell中将是yourList >>= id,这比yourList flatMap(e => e)yourList >>= \x -> x更容易阅读。是否有YourList.SelectMany(Identity) - Jörg W Mittag

3
聚合是什么?
myLists.Aggregate((left, right) => left.Union(right));

对我而言,这比使用SelectMany更具表现力,因为它准确地告诉你正在做什么:通过在所有列表上调用union来聚合你的列表。

+1 ... 我同意你的观点 ... 它比 SelectMany 更具表达力 - Thurein

3
您可以使用SelectMany扩展方法。
List<List<String>> masterList = { {"A" , "B" }, {"C" , "D" } };

IEnumerable<string> results = masterList.SelectMany(l => l);

不会返回List<string>。 - JR Kincaid
只能使用数组初始化表达式来对数组类型进行赋值。尝试使用一个 new 表达式代替。 - Alexander Taran
此答案不考虑重复项。不是列表的并集。 - Brian Genisio

3
var result = myLists.SelectMany(l => l);

此答案不考虑重复项。不是列表的并集。 - Brian Genisio
@Brian:在这个答案发布之后,OP添加了重复项的要求。 - BFree
OP问如何合并所有列表。按定义,联合运算符排除重复项。这在集合理论和LINQ中的Union实现中都是正确的。您的解决方案并未给出集合的联合,而是将它们连接在一起。这是不同的。 - Brian Genisio

1

只是为了好玩:

(from list in theList from e in list select e).Distinct().ToList()

这当然是与 @Alexander Taran 的解决方案相同,只不过使用查询语法而不是 Lambda 语法。(或者至少应该是 - 我手边没有 LINQPad。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接