Система.ArgumentNullException: ‘Значение не может быть нулевым. Имя параметра: ключ’

#c# #linq

#c# #linq

Вопрос:

В настоящее время я получаю ошибку в моей логике группировки. Я пытаюсь суммировать значения в EMV для одинаковых названий продуктов. Я получаю ошибку при передаче только некоторого списка. Как мне избежать этого исключения. Я не знаю о выполнении нулевых проверок в linq experssion

 System.ArgumentNullException: 'Value cannot be null. Parameter name: key'
  

Код

 public Dictionary<string, decimal> SumProductEmv(IEnumerable<FirmWideAllocationsViewModel> allProducts)
{
    if (allProducts == null)
        return null;

    return allProducts
        .GroupBy(product => product.ProductName)
        .Select(group => new
        {
            ProductName = group.Key, // this is the value you grouped on - the ProductName
            EmvSum = group.Sum(item => item.Emv)
        })
        .ToDictionary(x => x.ProductName, x => x.EmvSum);
}
  

Комментарии:

1. Предположительно ProductName равно нулю. Я бы предположил, что .Where перед тем, как группа by решит это.

Ответ №1:

Вы могли бы отфильтровать null или очистить ключи с помощью Where , попробуйте это:

 return allProducts
    .Where(product => !string.IsNullOrEmpty(product.ProductName))
    .GroupBy(product => product.ProductName)
    .Select(group => new
    {
        ProductName = group.Key, // this is the value you grouped on - the ProductName
        EmvSum = group.Sum(item => item.Emv)
    })
    .ToDictionary(x => x.ProductName, x => x.EmvSum);
  

Кроме того, вы могли бы Distinct() предотвратить исключение ArgumentException: элемент с таким же ключом уже существует в словаре, но тогда вам нужно решить, какой элемент вы хотите использовать, первый, последний и т.д.