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

是否可以在。net中使用c#将两个或多个列表转换为一个列表?

例如,

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

假设您想要一个包含指定类别id的产品的所有列表,您可以将查询视为投影后跟压扁操作。有一个LINQ操作符可以做到:< >强SelectMany < / >强

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

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

如果你已经有了代表每个Id的产品的列表,那么你需要的是连接,就像其他人指出的那样。

您需要使用Concat操作

你可以使用Concat扩展方法:

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

你可以使用LINQ ConcatToList方法:

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

注意,还有更有效的方法可以做到这一点——上面的方法基本上会遍历所有条目,创建一个动态大小的缓冲区。由于您可以预测开始时的大小,因此不需要这种动态大小…所以你可以使用:

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

(为了提高效率,AddRangeICollection<T>进行了特殊处理。)

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

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

列表。AddRange将通过添加额外的元素来改变(突变)现有的列表:

list1.AddRange(list2); // list1 now also has list2's items appended to it.

或者,在现代的不可变风格中,你可以在不改变现有列表的情况下投影出一个新的列表:

Concat,它表示由list1的项组成的无序序列,后面跟着list2的项:

var concatenated = list1.Concat(list2).ToList();

不完全相同的是,联盟投射了一个不同的项目序列:

var distinct = list1.Union(list2).ToList();

注意,要使Union的“值类型不同”行为作用于引用类型,你需要为你的类定义相等比较(或者使用record类型的内置比较器)。

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

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

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

我已经对它进行了评论,但我仍然认为这是一个有效的选择,只需测试一下在您的环境中,哪种解决方案更好。在我的特定情况下,使用source.ForEach(p => dest.Add(p))比经典的AddRange执行得更好,但我没有调查为什么在低级别。

你可以在这里看到一个示例代码: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));

测试一下,看看它是否适合你。

免责声明:我不提倡这个解决方案,我发现Concat是最清楚的一个。我刚刚在与Jon的讨论中指出,在我的机器中,这种情况比AddRange执行得更好,但他说,以比我多得多的知识,这是没有意义的。如果你想比较的话,这就是要点。

在特殊情况下:“List1的所有元素都去一个新的List2”:(例如,一个字符串列表)

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

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

// 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()方法。

当你有几个列表,但你不知道具体有多少,用这个:

listsOfProducts包含很少的对象列表。

List<Product> productListMerged = new List<Product>();


listsOfProducts.ForEach(q => q.ForEach(e => productListMerged.Add(e)));

我知道这是一个老问题,我想我可能只是说说我的意见。

如果你有一个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;
}

希望这能有所帮助。

将多个列表合并或合并为一个列表。

    有一件事必须是真的:两个列表的类型都将是 李平等。< / p > < / > 例如:如果我们有string的列表,那么我们可以添加另一个列表到

例子:

class Program
{
static void Main(string[] args)
{
List<string> CustomerList_One = new List<string>
{
"James",
"Scott",
"Mark",
"John",
"Sara",
"Mary",
"William",
"Broad",
"Ben",
"Rich",
"Hack",
"Bob"
};


List<string> CustomerList_Two = new List<string>
{
"Perter",
"Parker",
"Bond",
"been",
"Bilbo",
"Cooper"
};


// Adding all contents of CustomerList_Two to CustomerList_One.
CustomerList_One.AddRange(CustomerList_Two);


// Creating another Listlist and assigning all Contents of CustomerList_One.
List<string> AllCustomers = new List<string>();


foreach (var item in CustomerList_One)
{
AllCustomers.Add(item);
}


// Removing CustomerList_One & CustomerList_Two.
CustomerList_One = null;


CustomerList_Two = null;
// CustomerList_One & CustomerList_Two -- (Garbage Collected)
GC.Collect();


Console.WriteLine("Total No. of Customers : " +  AllCustomers.Count());
Console.WriteLine("-------------------------------------------------");
foreach (var customer in AllCustomers)
{
Console.WriteLine("Customer : " + customer);
}
Console.WriteLine("-------------------------------------------------");


}
}

如果你有一个空列表,你想合并它与一个填充列表,不要使用Concat,而是使用AddRange。

List<MyT> finalList = new ();


List<MyT> list = new List<MyT>() { a = 1, b = 2, c = 3 };


finalList.AddRange(list);