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

是否有可能将两个或更多的列表转换成一个单一的列表,在.NET中使用C#?

例如,

public static List<Product> GetAllProducts(int categoryId){ .... } . . . var productCollection1 = GetAllProducts(CategoryId1); var productCollection2 = GetAllProducts(CategoryId2); var productCollection3 = GetAllProducts(CategoryId3); 

你可以使用LINQ ConcatToList方法:

 var allProducts = productCollection1.Concat(productCollection2) .Concat(productCollection3) .ToList(); 

请注意,有更有效的方法来做到这一点 – 上述将基本上遍历所有条目,创build一个dynamic大小的缓冲区。 正如你可以预测的大小开始,你不需要这个dynamic的大小…所以你可以使用:

 var allProducts = new List<Product>(productCollection1.Count + productCollection2.Count + productCollection3.Count); allProducts.AddRange(productCollection1); allProducts.AddRange(productCollection2); allProducts.AddRange(productCollection3); 

(为了提高效率, AddRange专用于ICollection<T> )。

我不会采取这种方法,除非你真的必须。

假设您想要一个包含指定类别标识的所有产品的列表,可以将查询视为投影,然后进行展操作。 有一个LINQ运算符可以这样做: SelectMany

 // implicitly List<Product> var products = new[] { CategoryId1, CategoryId2, CategoryId3 } .SelectMany(id => GetAllProducts(id)) .ToList(); 

在C#4中,可以将SelectMany缩短为: .SelectMany(GetAllProducts)

如果您已经有了代表每个Id的产品的列表,那么您需要的是一个串联 ,如其他人指出的那样。

你可以使用LINQ来组合它们:

  list = list1.Concat(list2).Concat(list3).ToList(); 

更传统的使用List.AddRange()可能会更有效。

你可以使用Concat扩展方法:

 var result = productCollection1 .Concat(productCollection2) .Concat(productCollection3) .ToList(); 

看看List.AddRange来合并列表

 list4 = list1.Concat(list2).Concat(list3).ToList(); 

我已经评论过了,但我仍然认为这是一个有效的select,只是testing一下你的环境是更好的解决scheme还是其他解决scheme。 在我的具体情况下,使用source.ForEach(p => dest.Add(p))比经典的AddRangeperformance更好,但我没有调查为什么在低级别。

你可以在这里看到一个示例代码: https : //gist.github.com/mcliment/4690433

所以选项是:

 var allProducts = new List<Product>(productCollection1.Count + productCollection2.Count + productCollection3.Count); productCollection1.ForEach(p => allProducts.Add(p)); productCollection2.ForEach(p => allProducts.Add(p)); productCollection3.ForEach(p => allProducts.Add(p)); 

testing它,看看它是否适合你。

免责声明 :我不是主张这个解决scheme,我发现Concat是最清晰的一个。 我刚刚在与AddRange讨论中说过,在我的机器中,这种情况比AddRangeperformance得更好,但是他说,比我知识更多,这是没有意义的。 如果你想比较的话,有要点。

您需要使用Concat操作

在特殊情况下:“List1的所有元素都转到新的List2”(例如,一个string列表)

 List<string> list2 = new List<string>(list1); 

在这种情况下,使用list1中的所有元素生成list2

 // I would make it a little bit more simple var products = new List<List<product>> {item1, item2, item3 }.SelectMany(id => id).ToList(); 

这样,它是一个多维的列表和.SelectMany()将其扁平化为一个IEnumerable的产品,然后我使用.ToList()方法。