我有一个相当新的问题:
这样做
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
列表连接起来?然后,当我在第二个例子中使用新列表尝试它时,为什么它不起作用?
由于
答案 0 :(得分: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
在此处不执行任何操作。
答案 1 :(得分:0)
EmptyList.Select
遍历....空列表。因此,结果也将是空的。