为啥与空列表连接时返回列表但与新列表连接时不返回?
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<IResult>
。调用ToList
后,它变成了List<IResult>
。那么TResult
是什么?它是您传递给Repeat
- IEnumerable<int>
的参数类型。所以总的来说,emptyList
是一个List<IEnumerable<int>>
。
现在,emptyList
是空的吗?
不是,但是里面的IEnumerable<int>
,是。
emptyList
有一个元素。该元素是一个空的IEnumerable<int>
。为什么?因为你告诉它给Repeat
一个空的可枚举一次。 “空可枚举”并不意味着什么。重复一个空的可枚举对象会得到一个空的可枚举对象,而不是虚无。
在您了解这一点后,这里发生的事情就很清楚了。您将空可枚举连接到1
,这使得joinedList
成为1
。
在第二种情况下,new List<List<int>>()
创建了一个没有列表的空列表,因此Select
在这里不做任何事情。
【讨论】:
【参考方案2】:EmptyList.Select
遍历一个....空列表。因此,结果也将为空。
【讨论】:
以上是关于为啥与空列表连接时返回列表但与新列表连接时不返回?的主要内容,如果未能解决你的问题,请参考以下文章
AWS Amplify GraphQL - 一对多连接在查询时返回空列表