我有两个基于类
的列表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}
列表中的项目顺序并不重要。
如何实现此合并。
答案 0 :(得分: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();
答案 1 :(得分:8)
您可以使用以下内容:
var query = list1.Concat(list2)
.GroupBy(x => x.id)
.Select(g => g.OrderByDescending(x => x.quantity).First())
.ToList();
这不好,但它会起作用。 (这种方法避免了创建一个新的测试实例,因为lc。的答案确实如此。我不知道这对你来说是否重要,但我可以看到它在某些情况下很重要。)
它确实假设如果ID在任一列表中出现多次,那么您仍然只希望在结果中返回一次。
或者,使用MoreLINQ中的MaxBy
:
var query = list1.Concat(list2)
.GroupBy(x => x.id)
.Select(g => g.MaxBy(x => x.quantity))
.ToList();