2016-11-25 3 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) 
    }; 

Как объединить две коллекции в одну, а также объединить эти элементы, которые совпали «Name» поля? В то же время для элементов объединенные имена должны суммировать поле «Количество». На конце должно быть

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

Использование Concat, GroupBy и Sum:

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