【问题标题】:How to get all elements out of multiple List<>?如何从多个 List<> 中获取所有元素?
【发布时间】:2011-09-19 15:57:40
【问题描述】:

在 C# 中,我有以下类型:

List<List<mytype>> MyLists;
List<mytype> MainList;

我想将 MyList 中所有 List 中的每个元素放入 MainList 中。然后 MainList 将仅包含由 MyList 的每个 List 内的所有元素组成的元素。我尝试了以下方法,但收到有关无法推断类型的错误:

MyLists.ForEach(list => MainList.AddRange(list.SelectMany(x => x != null)));

我不确定要在 SelectMany() 中放入什么,因为我想要 List 中的所有元素。这些元素不需要满足任何标准。

有什么建议吗?

【问题讨论】:

  • 您是否希望MainListMyLists 列表中的元素添加 到其中(我的回答就是这样做的)?或者您是否希望MainList 包含MyLists 中列表中唯一 的元素?在那种情况下,按照@Reed 所说的去做
  • 另外 - 如果需要空值检查,我为此添加了一些选项 - 我不能 100% 确定 which 列表可能包含空值,所以我展示了这两个选项在我的编辑中...

标签: c# linq c#-3.0 linq-to-objects


【解决方案1】:
MainList.AddRange(from list in MyLists
                  from element in list
                  select element);

或者,如果你愿意,

MainList.AddRange(MyLists.SelectMany(list => list));

【讨论】:

  • 问题中的x!=null 怎么样?
  • 所以问题是使用SelectMany 而不是Where?只是想学习
  • @Hemal: SelectMany 将包含序列的序列“展平”(即:List&lt;List&lt;T&gt;&gt; 为一个IEnumerable&lt;T&gt;) - 用于过滤的位置(即:删除元素,例如那些为空的元素) .它们执行两种截然不同的操作。
  • @Hemal:解决方案不应包括空检查。 OP 说“我不确定要在 SelectMany() 中放入什么,因为我想要 List 中的所有元素。”换句话说,他把它放进去是因为这是一个必需的参数,而不是因为他想过滤列表。
  • 我想我明白了。谢谢@Reed、phoog 和 Akash
【解决方案2】:

这只需要一个SelectMany 调用:

MainList = MyLists.SelectMany(l => l).ToList();

请注意,这不需要在此调用之前构造/初始化 MainList,因为它已完全从 ToList() 调用中初始化。


编辑:

由于您确实包含了 null 检查,如果您需要从列表中删除 null 元素,您也可以添加该检查:

MainList = MyLists.SelectMany(l => l.Where(i => i != null)).ToList();

And/Or 过滤整个null 列表:

MainList = MyLists
             .Where(l => l != null)
             .SelectMany(l => l.Where(i => i != null))
             .ToList();

另外,如果你想添加项到你的MainList,而不是让MainList在原始列表中“只有元素”,你仍然可以使用AddRange

MainList.AddRange(MyLists.SelectMany(l => l));

【讨论】:

    【解决方案3】:

    另一个选项,更接近您最初的尝试:MyLists.ForEach(list =&gt; MainList.AddRange(list));

    换句话说,如果您使用 ForEach 和 AddRange,则不需要 SelectMany 甚至 Select。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 2016-01-10
      • 2016-07-24
      • 2012-07-18
      • 2016-08-17
      • 1970-01-01
      • 2012-07-30
      相关资源
      最近更新 更多