在以下代码中:
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()
更新,还是有理由让它返回无效?
答案 0 :(得分:6)
AddRange
更改基础List对象。没有LinQ方法可以做到这一点。所以它根本不同,不应该用于LinQ concatination。它的返回值void
反映了这一点。
答案 1 :(得分:4)
你已经回答了自己的问题。如果要从两个列表中使用不同的值,请使用Union,如果只想加入两个列表,请使用Concat。一旦两个枚举已加入,您可以调用ToList()。
AddRange是List的一个方法,它与LINQ无关。
答案 2 :(得分:2)
AddRange
是List<T>
上一个早于LINQ的方法。它会原位改变当前列表,因此不需要返回它(它也不遵循你现在发现很多流畅的语法风格)。 List<T>
不是不可变的,所以变异方法调用很好。
有linq方法可以将列表连接在一起(正如您在问题中所述)。我倾向于没有嵌入linq方法链中的变异动作,因为它违背了linq只是一个查询/投影设置并且不“更新”事物的一般想法。
答案 3 :(得分:0)
在您的情况下,最好使用Enumerable.Concat
:
animals = cats.Select(x => new Animal() {Type = "Cat", Name = x})
.Concat(dogs.Select(x => new Animal() {Type = "Dog", Name = x})).ToList();