我有两个列表
var left={[ID=1,Name='A',Qty1=0,Qty2=5],[ID=2,Name=B,Qty1=0,Qty2=52]};
var right={[ID=1,Name='A',Qty1=57,Qty2=0],[ID=2,Name=B,Qty1=84,Qty2=0]};
var outer=left.union(right);
我想得到以下结果:
outer={[ID=1,Name='A',Qty1=57,Qty2=5],[ID=2,Name=B,Qty1=84,Qty2=52]}
我该怎么做?如何编写比较器类?
修改: 我有两个清单
var target=(...new ClassA{ID=a.ID,Name=a.Name,TargetQty=b.TargetValue}).ToList();
var sales=(....new ClassA{ID=a.ID,Name=a.Name,SalesQty=b.SaleValue}).ToList();
现在我想要一个完整的外部联接。我怎么能得到它?
答案 0 :(得分:2)
听起来你可能想要一个内部联接:
var query = left.Join(right, l => l.Id, r => r.Id,
(l, r) => new { l.Id, l.Name, r.Qty1, l.Qty2 });
(您可能想加入Id
和Name
;不清楚Id
是否足够。)
答案 1 :(得分:1)
在这种情况下,union不会带来所需的输出。
Jon Skeet正确地指出内部联盟会做你想做的事。考虑到你的问题,似乎你需要内部联接与各行的总和,如下所示。如果不是您的要求,那么您需要修改您的问题。
public class Program
{
public static void Main()
{
var left= new List<Product>(){
new Product(){ID=1,Name="A",Qty1=0,Qty2=5},
new Product(){ID=2,Name="B",Qty1=0,Qty2=52}
};
var right= new List<Product>(){
new Product(){ID=1,Name="A",Qty1=57,Qty2=0},
new Product(){ID=2,Name="B",Qty1=84,Qty2=0}
};
var outer=left.Union(right);
Console.WriteLine(outer.Count());//will be four which is not expected.
var query = left.Join(right, d => d.ID, e=> e.ID, (f,g) => new Product(){ID = f.ID, Name = f.Name, Qty1 = f.Qty1+g.Qty1, Qty2 = f.Qty2+g.Qty2});
foreach(var item in query)
{
item.Print();
}
}
}
public class Product {
public int ID{get; set;}
public string Name{get; set;}
public int Qty1{get; set;}
public int Qty2{get; set;}
public void Print()
{
Console.WriteLine("ID : {0}", ID);
Console.WriteLine("Name: {0}", Name);
Console.WriteLine("Qty1: {0}", Qty1);
Console.WriteLine("Qty2: {0}", Qty2);
}
}
以下是上述代码的输出:
4
ID:1 姓名:A 数量1:57 数量2:5
ID:2 姓名:B 数量1:84 数量2:52
您可以在此修改和测试此代码=&gt; link