2017-06-21 25 views
0

我有一个相当福利局问题:为什么连接到一个空列表会返回一个列表,但不会与新列表连接在一起?

这样做

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能够conca empty列表与nonEmpty列表中的所有物品是否为空列表本身?那么为什么当我在第二个例子中用一个新列表尝试它时它不工作?

感谢

+3

您的第一个'emptyList'是一个包含一个空列表(一个元素)的枚举类型。你的第二个'emptyList'是一个空列表(零元素)。看到这一点,你应该能够看到它如何到达输出。 – Steven

回答

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在这里不做任何事情。

+0

感谢您的一个很好的解释 – LePrinceDeDhump

0

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

相关问题