Вы можете сгруппировать элементы по 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}"));
Если у вас есть класс с другими свойствами, которые Вы хотите включить, что не являются агрегированными, тогда мы можем использовать элемент 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();