-1

我有两个清单

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

现在我想要一个完整的外部连接。我怎么能得到那个?

4

2 回答 2

2

听起来你可能想要一个内部连接:

var query = left.Join(right, l => l.Id, r => r.Id,
                      (l, r) => new { l.Id, l.Name, r.Qty1, l.Qty2 });

(您可能想同时加入IdName;尚不清楚 是否Id足够。)

于 2015-02-01T09:07:11.897 回答
1

在这种情况下,联合不会带来所需的输出。

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

编号:1 名称:A 数量 1:57 数量 2:5

编号:2 名称:B 数量 1:84 数量 2:52

您可以在此处修改和测试此代码 =>链接

于 2015-02-01T12:20:45.307 回答