2017-06-21 22 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遍歷....空列表。因此,結果也是空的。

相關問題