2017-06-21 10 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となりますか? 2番目の例で新しいリストで試してみると、なぜうまくいかないのですか? IEnumerable<IResult>を返しEnumerable.Repeat

おかげ

+3

最初の 'emptyList'は、1つの空のリスト(1つの要素)を含む列挙型です。 2番目の 'emptyList'はリストの空のリスト(ゼロ要素)です。これを見ると、どのように出力に到達するのかを知ることができます。 – Steven

答えて

1

ToListを呼び出した後、List<IResult>になります。 TResultとは何ですか? Repeat - IEnumerable<int>に渡した引数の型です。従って、emptyListList<IEnumerable<int>>です。

今、emptyListは空ですか?

いいえ、IEnumerable<int>です。

emptyListに要素があります。要素は空のIEnumerable<int>です。どうして?あなたはRepeatにそれを語ったので、一度空の列挙可能です。 「空の列挙可能」は何も意味しません。空の列挙を繰り返すと、空ではなく空の列挙可能なものが得られます。

これを理解した後は、ここで何が起こっているのかははっきりしています。空の列挙型を連結して1にし、joinedList{1}にします。

第2のケースでは、new List<List<int>>()は、リストを持たない空のリストを作成するので、Selectはここで何もしません。

+0

良い説明をありがとう – LePrinceDeDhump

0

EmptyList.Selectを繰り返す。したがって、結果も空になります。

関連する問題