是否可以使用C#在.NET中将两个或多个列表转换为一个列表?
例如,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 408
var allProducts = productCollection1.Concat(productCollection2)
.Concat(productCollection3)
.ToList();
Run Code Online (Sandbox Code Playgroud)
请注意,有更有效的方法可以做到这一点 - 上面将基本上遍历所有条目,创建一个动态大小的缓冲区.由于您可以预测开始的大小,因此您不需要此动态大小调整...因此您可以使用:
var allProducts = new List<Product>(productCollection1.Count +
productCollection2.Count +
productCollection3.Count);
allProducts.AddRange(productCollection1);
allProducts.AddRange(productCollection2);
allProducts.AddRange(productCollection3);
Run Code Online (Sandbox Code Playgroud)
(为了提高效率,这AddRange是特殊的ICollection<T>.)
除非你真的需要,否则我不会采用这种方法.
Ani*_*Ani 40
假设您想要一个包含指定类别ID的所有产品的列表,您可以将查询视为投影,然后进行展平操作.有一个LINQ运算符可以做到:SelectMany.
// implicitly List<Product>
var products = new[] { CategoryId1, CategoryId2, CategoryId3 }
.SelectMany(id => GetAllProducts(id))
.ToList();
Run Code Online (Sandbox Code Playgroud)
在C#4中,您可以将SelectMany缩短为: .SelectMany(GetAllProducts)
如果您已经有代表每个Id的产品的列表,那么您需要的是连接,正如其他人指出的那样.
Bot*_*000 22
你可以使用LINQ组合它们:
list = list1.Concat(list2).Concat(list3).ToList();
Run Code Online (Sandbox Code Playgroud)
List.AddRange()然而,更传统的使用方法可能更有效.
您可以使用Concat扩展方法:
var result = productCollection1
.Concat(productCollection2)
.Concat(productCollection3)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题,我想我可能只需要加 2 美分。
如果你有List<Something>[]你可以加入他们使用Aggregate
public List<TType> Concat<TType>(params List<TType>[] lists)
{
var result = lists.Aggregate(new List<TType>(), (x, y) => x.Concat(y).ToList());
return result;
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。