在C#中将List<List<T>>转换为List<T>

23

我有一个 List<List<int>>。我想将它转换为一个List<int>,其中每个int都是唯一的。我想知道是否有人能使用LINQ提供一个优雅的解决方案。

我希望能够使用Union方法,但它每次都会创建一个新的List<>。因此,我想避免像这样做:

List<int> allInts = new List<int>();

foreach(List<int> list in listOfLists)
   allInts = new List<int>(allInts.Union(list));

有任何建议吗?

谢谢!

3个回答

66
List<List<int>> l = new List<List<int>>();

l.Add(new List<int> { 1, 2, 3, 4, 5, 6});
l.Add(new List<int> { 4, 5, 6, 7, 8, 9 });
l.Add(new List<int> { 8, 9, 10, 11, 12, 13 });

var result = (from e in l
              from e2 in e
              select e2).Distinct();

更新于 2013年9月

但现在我会这样写:

var result2 = l.SelectMany(i => i).Distinct();

这就是我一直在寻找的。只需在Distinct的末尾添加.ToList(),我就得到了我需要的东西。谢谢! - user57230
+1 因为这很棒——你考虑过加入一个“where e!= null”的条件吗?这样当你的列表中有一个空列表时,它就不会开始抛出异常了。 - Ria

18
List<int> result = listOfLists
  .SelectMany(list => list)
  .Distinct()
  .ToList();

10

怎么样:

HashSet<int> set = new HashSet<int>();
foreach (List<int> list in listOfLists)
{
    set.UnionWith(list);
}
return set.ToList();

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