【问题标题】:Why does concatenating with an empty list return a list but not when concatenating with new list?为什么与空列表连接时返回列表但与新列表连接时不返回?
【发布时间】:2017-11-23 20:56:10
【问题描述】:

我有一个相当新的问题:

这样做

 var emptyList = Enumerable.Repeat(Enumerable.Empty<int>(), 1).ToList();
 var nonEmptyList = new List<int> { 1 };
 var joinedList = emptyList.Select(x => x.Concat(nonEmptyList)).ToList();

返回一个非空列表

但是这会返回一个空列表

 var emptyList = new List<List<int>>();
 var nonEmptyList = new List<int> { 1 };
 var joinedList = emptyList.Select(x => x.Concat(nonEmptyList)).ToList();

当所选项目本身是空列表时,Linq 如何将 empty 列表中的项目与 nonEmpty 列表连接起来?然后为什么我在第二个示例中尝试使用新列表时它不起作用?

谢谢

【问题讨论】:

  • 您的第一个“emptyList”是一个包含一个空列表(一个元素)的可枚举。您的第二个“emptyList”是一个空列表(零元素)。看到这里,你应该可以看到它是如何到达输出的。

标签: c# linq


【解决方案1】:

Enumerable.Repeat 返回一个IEnumerable&lt;IResult&gt;。调用ToList 后,它变成了List&lt;IResult&gt;。那么TResult 是什么?它是您传递给Repeat - IEnumerable&lt;int&gt; 的参数类型。所以总的来说,emptyList 是一个List&lt;IEnumerable&lt;int&gt;&gt;

现在,emptyList 是空的吗?

不是,但是里面的IEnumerable&lt;int&gt;

emptyList 有一个元素。该元素是一个空的IEnumerable&lt;int&gt;。为什么?因为你告诉它给Repeat 一个空的可枚举一次。 “空可枚举”并不意味着什么。重复一个空的可枚举对象会得到一个空的可枚举对象,而不是虚无。

在您了解这一点后,这里发生的事情就很清楚了。您将空可枚举连接到1,这使得joinedList 成为{1}

在第二种情况下,new List&lt;List&lt;int&gt;&gt;() 创建了一个没有列表的空列表,因此Select 在这里不做任何事情。

【讨论】:

    【解决方案2】:

    EmptyList.Select 遍历一个....空列表。因此,结果也将为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多