2012-07-10 43 views
2

我有基于类合并两个列表在C#中根据条件

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} 

顺序并不重要。

如何实现这种合并。

+5

你尝试过什么?什么是绊倒你? – dlev 2012-07-10 17:18:10

回答

8

您可以使用类似:

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

这不是很好,但它的工作。 (此方法可避免创建测试为LC的实例的。答案不,我不知道这是否是对你很重要吗,但我可以看到它是在某些情况下非常重要的。)

,它假定如果一个ID在任何一个列表中出现不止一次,那么您仍然只希望它在结果中返回一次。

另外,使用MaxByMoreLINQ

var query = list1.Concat(list2) 
       .GroupBy(x => x.id) 
       .Select(g => g.MaxBy(x => x.quantity)) 
       .ToList(); 
+0

可以用'.Max(x => x.quantity)'代替那个讨厌的'.OrderByDescending(x => x.quantity).First()'。 – Blindy 2012-07-10 17:22:41

+4

@Bindind:不保留*现有的*对象。 'Max'将返回数量,而不是数量最大的对象。 – 2012-07-10 17:23:18

+0

哦,我明白了。有趣的一点! – Blindy 2012-07-10 17:24:08

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();