AddRange()是否返回一个列表?

本文关键字:一个 列表 返回 是否 AddRange | 更新日期: 2023-09-27 18:16:54

在以下代码中:

var cats = new List<string>() {"cat1", "cat2"};
var dogs = new List<string>() {"dog1", "dog2"};
var animals = new List<Animal>();
animals = (cats.Select(x => new Animal() {Type = "Cat", Name = x}).ToList().AddRange(
                        dogs.Select(x => new Animal() {Type = "Dog", Name = x}).ToList())).ToList();

在末尾调用ToList()是错误的,因为AddRange()返回void。这在现在使用Linq类型查询时似乎不正确。

我发现我可以将其更改为.Union().Concat()来解决问题,但AddRange()不应该更新,或者是否有理由返回void?

AddRange()是否返回一个列表?

AddRange更改底层List对象。没有LinQ方法能做到这一点。因此,它从根本上是不同的,不应该在LinQ连接中使用。void的返回值反映了

你已经回答了自己的问题。如果您希望两个列表中的值不同,请使用Union,如果您只想连接两个列表,请使用Concat。一旦两个可枚举对象连接在一起,就可以调用ToList()。

adrange是List本身的一个方法,与LINQ无关。

AddRangeList<T>上的一个早于LINQ的方法。它在原地改变当前列表,因此不需要返回它(它也不遵循您现在经常看到的流畅语法风格)。List<T>不是不可变的,所以改变方法调用是可以的。

有linq方法可以将列表连接在一起(正如您在问题中所注意到的)。我倾向于不在linq方法链中嵌入突变动作,因为它违背了linq只是一个查询/投影设置而不"更新"事物的一般想法。

在您的情况下,最好使用Enumerable.Concat:

animals = cats.Select(x => new Animal() {Type = "Cat", Name = x})
                .Concat(dogs.Select(x => new Animal() {Type = "Dog", Name = x})).ToList();