为什么与空列表连接会返回列表,但在与新列表连接时却没有?

时间:2017-06-21 05:56:53

标签: c# linq

我有一个相当新的问题:

这样做

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

返回非空列表

enter image description here

然而,这会返回一个空列表

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

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

由于

2 个答案:

答案 0 :(得分:1)

Enumerable.Repeat会返回IEnumerable<IResult>。致电ToList后,它变为List<IResult>。那么TResult是什么?它是您传递给Repeat - IEnumerable<int>的参数的类型。总而言之,emptyListList<IEnumerable<int>>

现在,emptyList是空的吗?

不,但其中的IEnumerable<int>

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

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

在第二种情况下,new List<List<int>>()会创建一个没有列表的空列表,因此Select在此处不执行任何操作。

答案 1 :(得分:0)

EmptyList.Select遍历....空列表。因此,结果也将是空的。