3

我有两个基于班级的清单

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}

合并列表需要包含两个列表中的所有项目,如果两个列表中出现相同的 id,则应比较数量并选择数量较大的项目。合并列表需要

Merged list
{"A", 1}
{"B", 4}
{"C", 3}
{"D", 5}

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

如何实现此合并。

4

2 回答 2

9

你可以使用类似的东西:

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

这不好,但它会工作。(这种方法避免像 lc. 的回答那样创建一个的 test 实例。我不知道这对你是否重要,但我可以看到它在某些情况下很重要。)

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

或者,MaxBy使用MoreLINQ

var query = list1.Concat(list2)
                 .GroupBy(x => x.id)
                 .Select(g => g.MaxBy(x => x.quantity))
                 .ToList();
于 2012-07-10T17:20:58.520 回答
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();
于 2012-07-10T17:19:49.850 回答