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
更改底层List对象。没有LinQ方法能做到这一点。因此,它从根本上是不同的,不应该在LinQ连接中使用。void
的返回值反映了
你已经回答了自己的问题。如果您希望两个列表中的值不同,请使用Union,如果您只想连接两个列表,请使用Concat。一旦两个可枚举对象连接在一起,就可以调用ToList()。
adrange是List本身的一个方法,与LINQ无关。
AddRange
是List<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();