Проверьте значения внутри метода LINQ Sum () с лямбдами в C # - PullRequest
2 голосов
/ 12 мая 2011

Мне нужно сумма всех значений в одном объекте.Значения извлекаются из базы данных и сохраняются в List<T>.Если одно из значений равно -1, я хочу использовать 0 в сумме.

Вот код, который я использую для выполнения задачи:

lprod_projectionActualvalue = lprod_monthlyReport.Sum(m => new
{
    Monthly_ActualValue = (m.Monthly_ActualValue != -1) ? 
      m.Monthly_ActualValue : 0F
});

Monthly_ActualValue имеет тип float? .Компилятор выдает мне сообщение о том, что я не могу преобразовать анонимный тип в число с плавающей точкой? .Это довольно странно, потому что я использую тот же код в предложении Select, не получая никакой ошибки.В чем может быть проблема?

Спасибо

Франческо

Ответы [ 4 ]

7 голосов
/ 12 мая 2011

Вы создаете новый анонимный тип, используя ключевое слово new {} и квадратные скобки, которые никогда не будут преобразованы в число с плавающей точкой. Если вы хотите, чтобы сумма была с плавающей точкой, удалите объявление анонимного типа и просто укажите выражение, создающее число с плавающей точкой, например:

lprod_projectionActualvalue = lprod_monthlyReport.Sum(m => (m.Monthly_ActualValue != -1) ? m.Monthly_ActualValue : 0F);
4 голосов
/ 12 мая 2011

Проблема в том, что вы создаете анонимный тип, используя new { ... } без особой очевидной причины ... и Sum не знает, как складывать значения анонимного типа. Попробуйте вместо этого:

lprod_projectionActualvalue = lprod_monthlyReport
    .Sum(m => m.Monthly_ActualValue != -1 ? m.Monthly_ActualValue : 0F);

Я немного удивлен, используя обнуляемый тип и магическое значение "не считается" (-1). Обычно вам нужен только один из этих вариантов, но я позволю вам сказать, что это действительно то, что вы хотите:)

(Я бы посоветовал вам взглянуть на .NET именования тоже ... эти подчеркивания не обычные, и мне неясно, что означает lprod. Просто общие советы.)

1 голос
/ 12 мая 2011

Ваша лямбда не возвращает float. Он объявляет новый анонимный тип с единственным свойством float, Monthly_ActualValue. Вы не можете Sum объекты этого типа, потому что для него не определено дополнение.

Попробуйте вместо этого:

lprod_projectionActualvalue = lprod_monthlyReport.Sum(m =>
    (m.Monthly_ActualValue != -1) ? m.Monthly_ActualValue : 0F
);
1 голос
/ 12 мая 2011

Я бы попытался сначала добавить выбор, а затем вызвать метод Sum

lprod_projectionActualvalue = lprod_monthlyReport.Select(m => new
{
    Monthly_ActualValue = (m.Monthly_ActualValue != -1) ? m.Monthly_ActualValue : 0F
}).Sum(m => m.Monthly_ActualValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...