2016-11-25 128 views
-8

我有两个集合:合并两个集合,总结等领域的重复项目

public interface ISomeNeededInterface 
{ 
    string Name { get; set; } 
    Guid Guid { get; set; } 
} 

public class Order : ISomeNeededInterface 
{ 
    public string Name { get; set; } 
    public Guid Guid { get; set; } 
} 

public class SalesOrder 
{ 
    public string Name { get { return Item.Name;} } 
    public double Price { get; set; } 
    public int Quantity { get; set; } 
    private ISomeNeededInterface Item { get; private set; } 

    public SalesOrder(ISomeNeededInterface _item) 
    { 
    Item = _item; 
    Price = _item.Pricce; 
    Quantity = _item.Quantity; 
    } 
} 

List<SalesOrder> Orders1 = new List<SalesOrder>() 
    { 
    new SalesOrder(new Order {"Ballon1", Guid.NewGuid();}, 2.54, 1), 
    new SalesOrder(new Order {"Ballon2", Guid.NewGuid();}, 2.54, 1), 
    }; 

List<SalesOrder> Orders2 = new List<SalesOrder>() 
    { 
    new SalesOrder(new Order {"Ballon1", Guid.NewGuid();}, 2.54, 2), 
    new SalesOrder(new Order {"Ball", Guid.NewGuid();}, 4.52, 1) 
    }; 

如何两个集合合并成一个,以及合并已恰逢“名称”字段这些元素?同时,对于这些元素,合并名称必须为“数量”字段的总和。最后必须是

List<SalesOrder> SummOrders = {"Ballon1", 2.54, 3, SOME_Item; "Ballon2", 2.54, 1, SOME_Item ; "Ball", 4.52, 1, SOME_Item } 

编辑:需要澄清的简单问题??好了,有更多的真正的“编辑”

+5

您尝试过什么吗?你得到了什么结果?我们没有准备好做你的工作,你必须在询问之前自己尝试 – Phate01

+0

当价格不符时会发生什么?你有没有试过GroupBy? –

+0

我这样做:在某些属性上找到两个集合中的匹配项。创建它们的集合并总结它们的字段。在这两个集合中(在上面的帖子中),我删除了重复集合的元素。结合所有三个集合。但我认为这太...错了))) – streamdown

回答

7

使用ConcatGroupBySum

List<SalesOrder> merged = Order1.Concat(Orders2) 
    .GroupBy(so => so.Name) 
    .Select(g => new SalesOrder(g.Key, g.First().Price, g.Sum(so => so.Quantity))) 
    .ToList(); 

认为Name可以等于但它有一个不同的Price,所以它实际上是一个不同的产品。然后,您可以通过包含两个属性的匿名类型进行分组(最好使用唯一标识符):

List<SalesOrder> merged = Order1.Concat(Orders2) 
    .GroupBy(so => new { so.Name, so.Price }) 
    .Select(g => new SalesOrder(g.Key.Name, g.Key.Price, g.Sum(so => so.Quantity))) 
    .ToList(); 
+0

谢谢。我认为找到了正确的道路。 – streamdown