为啥与空列表连接时返回列表但与新列表连接时不返回?

Posted

技术标签:

【中文标题】为啥与空列表连接时返回列表但与新列表连接时不返回?【英文标题】: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”是一个空列表(零元素)。看到这里,你应该可以看到它是如何到达输出的。 【参考方案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 遍历一个....空列表。因此,结果也将为空。

【讨论】:

以上是关于为啥与空列表连接时返回列表但与新列表连接时不返回?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amplify GraphQL - 一对多连接在查询时返回空列表

为啥数据库或语言平台在执行查询时不返回强类型类? [关闭]

字符串列表上的 BigQuery 左连接返回 null

带有连接的休眠自定义 SQL 查询 - 避免返回数组列表

当 XPath 验证器返回正确结果时,为啥 XmlNode.SelectNodes 返回空列表?

为啥初始化此类时不调用列表初始化?