#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: элемент с таким же ключом уже существует в словаре, но тогда вам нужно решить, какой элемент вы хотите использовать, первый, последний и т.д.