在C#.NET中将两个(或多个)列表合并为一个

是否可以使用C#在.NET中将两个或多个列表转换为一个列表?


例如,


public static List<Product> GetAllProducts(int categoryId){ .... }

.

.

.

var productCollection1 = GetAllProducts(CategoryId1);

var productCollection2 = GetAllProducts(CategoryId2);

var productCollection3 = GetAllProducts(CategoryId3);


慕妹3242003
浏览 2361回答 3
3回答

梵蒂冈之花

您可以使用LINQ Concat和ToList方法:var allProducts = productCollection1.Concat(productCollection2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Concat(productCollection3)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ToList();请注意,有更有效的方法可以执行此操作-上面的操作基本上会遍历所有条目,从而创建动态大小的缓冲区。正如您可以预测的开始大小一样,您不需要此动态大小调整...因此您可以使用:var allProducts = new List<Product>(productCollection1.Count +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; productCollection2.Count +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; productCollection3.Count);allProducts.AddRange(productCollection1);allProducts.AddRange(productCollection2);allProducts.AddRange(productCollection3);(为了提高效率AddRange而特例ICollection<T>。)除非您确实需要,否则我不会采用这种方法。

智慧大石

假设您想要一个包含指定类别ID的所有产品的列表,则可以将查询视为投影,然后进行展平操作。还有,做一个LINQ经营者:SelectMany。// implicitly List<Product>var products = new[] { CategoryId1, CategoryId2, CategoryId3 }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.SelectMany(id => GetAllProducts(id))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.ToList();在C#4中,可以将SelectMany缩短为: .SelectMany(GetAllProducts)如果您已经有代表每个ID的产品的列表,那么您需要的是串联,正如其他人指出的那样。

繁星coding

您可以使用LINQ将它们结合起来:&nbsp; list = list1.Concat(list2).Concat(list3).ToList();不过,较传统的使用方法List.AddRange()可能会更有效。
打开App,查看更多内容
随时随地看视频慕课网APP