根据条件在C#中合并两个列表

K K*_*K K 3 c# merge list

我有两个基于班级的列表

public class test
{
    public string id { get; set; }
    public Int32 quantity { get; set; }
}

List1 
{"A", 1}
{"B", 2}
{"C", 3}

List2
{"A", 1}
{"B", 4}
{"D", 5}
Run Code Online (Sandbox Code Playgroud)

合并列表需要包括列表中的所有项目,如果两个列表中都出现相同的ID,则应该比较数量并选择数量更大的数量.合并列表需要

Merged list
{"A", 1}
{"B", 4}
{"C", 3}
{"D", 5}
Run Code Online (Sandbox Code Playgroud)

列表中项目的顺序并不重要.

如何实现此合并.

lc.*_*lc. 8

假设"ID"应该始终是唯一的:

var list = (from l in List1.Concat(List2)
           group l by l.id into g
           select new test() {id = g.Key, quantity = g.Max(x=>x.quantity)})
           .ToList();
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 8

你可以使用类似的东西:

var query = list1.Concat(list2)
                 .GroupBy(x => x.id)
                 .Select(g => g.OrderByDescending(x => x.quantity).First())
                 .ToList();
Run Code Online (Sandbox Code Playgroud)

这不好,但它会起作用.(这种方法避免了创建一个的测试实例,因为lc.的答案确实如此.我不知道这对你来说是否重要,但我可以看到它在某些情况下很重要.)

它确实假设如果ID在任一列表中出现多次,那么您仍然只希望在结果中返回一次.

或者,使用MaxByMoreLINQ:

var query = list1.Concat(list2)
                 .GroupBy(x => x.id)
                 .Select(g => g.MaxBy(x => x.quantity))
                 .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @Blindy:不保留*现有*对象.`Max`将返回数量,而不是具有最大数量的对象. (4认同)