AddRange()应该返回一个列表

时间:2013-06-03 14:59:21

标签: c# linq

在以下代码中:

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()更新,还是有理由让它返回无效?

4 个答案:

答案 0 :(得分:6)

AddRange更改基础List对象。没有LinQ方法可以做到这一点。所以它根本不同,不应该用于LinQ concatination。它的返回值void反映了这一点。

答案 1 :(得分:4)

你已经回答了自己的问题。如果要从两个列表中使用不同的值,请使用Union,如果只想加入两个列表,请使用Concat。一旦两个枚举已加入,您可以调用ToList()。

AddRange是List的一个方法,它与LINQ无关。

答案 2 :(得分:2)

AddRangeList<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();