C#: найти объекты в массиве с одинаковым идентификатором и суммировать их количественные значения. Добавьте их в новый объект - PullRequest
0 голосов
/ 13 марта 2020

У меня есть массив или список объектов, возвращаемых из базы данных. Давайте возьмем это в качестве примера: это класс:

public class products
{
    public string name { get; set; }
    public int quantity { get; set; } 
    public long id{ get; set; }        
}



  List<Product> prod = new List<Product>()
prod = (call to the DB to get data back...)

массив возвращается с объектом продуктов

Что мне нужно, это l oop через этот массив и сложить количества для тех же идентификаторов. То есть сложите 2 + 7 для идентификатора 3 и добавьте эти данные к другому объекту, чтобы новый объект имел что-то вроде: total: 9, id: 3, то же самое снова для id 5, total: 7, id: 5 и так далее. .

Я не могу найти правильный способ сделать это. Я смотрел на Linq, но единственный способ, которым я его использовал, это указывать значения c. Пожалуйста, помогите мне с этим `

foreach (var p in prod){ Now what do i do?}

`

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Согласно вашему фрагменту кода, prod - это единичный продукт типа продуктов. Итак, при условии, что ваш код, который вызывает вызов базы данных, возвращает список расширений примерно так:

List<products> prod = new List<products>(); 
prod = _productRepository.GetProductData(prodId);

Вы можете использовать linq GroupBy (пожалуйста, включите System.Linq для использования метода расширения GroupBy linq), чтобы найти общее количество каждого product, как показано ниже:

var anonymousList = prod.GroupBy(p => p.id).Select(g => new {id = g.Key, totalQuantity = g.Sum(p => p.quantity)}).ToList()

Вышеприведенный список возвращает анонимный список объектов, где каждый объект содержит id и totalQuantity.

Если вас интересует словарь идентификатора продукта против totalQuantity, тогда используйте что-то вроде ниже:

Dictionary<long, int> dictionary = prod.GroupBy(p => p.id).ToDictionary(k => k.Key, v => v.Sum(p => p.quantity));

ОБНОВЛЕНИЕ на основе обсуждения комментариев: Вы можете вызывать GroupBy на Prod без проверки количества. Не будет исключений.

1 голос
/ 13 марта 2020

Самый простой способ - использовать GroupBy и Sum (оба используют System.Linq):

    List<Product> products = new List<Product>()
    {
        new Product(){Id = 1, Cost = 20.0M },
        new Product(){Id = 1, Cost = 30.0M },
        new Product(){Id = 2, Cost = 20.0M },
        new Product(){Id = 3, Cost = 20.0M },
        new Product(){Id = 3, Cost = 5.0M }
    };

    products.GroupBy(g => g.Id).ToList().ForEach(e => 
    {
            Console.WriteLine($"Total: {
               e.Sum(s => s.Cost)} for {e.Key}");
    });

Редактировать

С новой предоставленной информацией: Вы можете сделать это для конкретного класса:

public class Product
{
   public string name { get; set; }
   public int quantity { get; set; } 
   public long id{ get; set; }        
}

List<Product> products = new List<Product>();
var products = (call to the DB to get data back...).GroupBy(g => g.Id).ToList().ForEach(e => 
    {
       products.Add(new Product() 
       {
          Id = e.Key,
          Quantity = e.Sum(s => s.Quantity)
       })

    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...