[英]Should AddRange() return a list
在以下代碼中:
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 concatination。 它的返回值void
反映。
你已經回答了自己的問題。 如果要從兩個列表中使用不同的值,請使用Union,如果只想加入兩個列表,請使用Concat。 一旦兩個枚舉已加入,您可以調用ToList()。
AddRange是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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.