我有两个基于班级的列表
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)
列表中项目的顺序并不重要.
如何实现此合并.
假设"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)
你可以使用类似的东西:
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在任一列表中出现多次,那么您仍然只希望在结果中返回一次.
或者,使用MaxBy从MoreLINQ:
var query = list1.Concat(list2)
.GroupBy(x => x.id)
.Select(g => g.MaxBy(x => x.quantity))
.ToList();
Run Code Online (Sandbox Code Playgroud)