Как объединить 2 элемента в списке, которые представляют собой один и тот же элемент, но с разными количествами, в один, имеющий сумму количеств - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть 2 объекта Предмета в моем списке, которые имеют одинаковый идентификатор, но разные количества, есть ли способ объединить их в один Предмет, который будет иметь сумму обоих количеств Предметов?

1 Ответ

0 голосов
/ 25 апреля 2020

Вы можете сгруппировать элементы по Id, затем для каждой группы выберите новый элемент с ключом группы в качестве Id и сумму группы для свойств, которые вы хотите объединить. Было бы полезно опубликовать образец вашего класса и то, что вы уже сделали, но вот пример.

Сначала класс Item:

public class Item
{
    public int Id { get; set; }
    public int Qty { get; set; }
}

Затем список предметов :

var items = new List<Item>
{
    new Item {Id = 1, Qty = 5},
    new Item {Id = 1, Qty = 2},
    new Item {Id = 1, Qty = 3},
    new Item {Id = 2, Qty = 2},
    new Item {Id = 2, Qty = 1},
    new Item {Id = 3, Qty = 9},
};

Теперь, как сгруппировать их по Id и выбрать новый элемент для каждой группы, который содержит Id, а также сумму свойства Quantity:

var combinedItems = items
    .GroupBy(item => item.Id)
    .Select(group => new Item {Id = group.Key, Qty = group.Sum(item => item.Qty)})
    .ToList();

Вывод

combinedItems.ForEach(item => Console.WriteLine($"Id: {item.Id}, Qty: {item.Qty}"));

enter image description here


Если у вас есть класс с другими свойствами, которые Вы хотите включить, что не являются агрегированными, тогда мы можем использовать элемент First в группе, чтобы установить их.

Например, предположим, что наш класс имеет Name свойство (которое должно быть одинаковым для всех экземпляров) и свойство Price (которое может или не может быть одинаковым, поэтому мы хотим взять Average):

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Qty { get; set; }
} 

В этом случае мы используем элемент First для свойства Name и метод Average для Price, например:

var combinedItems = items
    .GroupBy(item => item.Id)
    .Select(group => new Item
    {
        Id = group.Key,                             // Key is the property we grouped by
        Name = group.First().Name,                  // Get the Name from the First item
        Price = group.Average(item => item.Price),  // Average the Price
        Qty = group.Sum(item => item.Qty)           // Sum the quantity
    })
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...