Как округлить обнуляемое десятичное значение при использовании System.Linq.Dynamic - PullRequest
0 голосов
/ 05 января 2012

Когда я пытаюсь использовать Math.Round (x, 0) или Math.Round (x), я получаю ошибку System.Linq.Dynamic.ParseException: No applicable method 'Round' exists in type 'Math'.

Когда я пытаюсь использовать Convert.ToInt64 (x), я получаю исключение Expression of type 'System.Nullable`1[System.Decimal]' cannot be used for parameter of type 'System.Object' of method 'Int64 ToInt64(System.Object)'

Когда я пытаюсь использовать (long)x, я получаю исключение No property or field 'long' exists in type 'DynamicClass1'.

Ответы [ 2 ]

1 голос
/ 05 января 2012

Ваша проблема в том, что Math.Round требует decimal, а не (обнуляется) decimal?.

Вы могли бы сделать что-то вроде этого:

decimal?[] values = { 0.1M, 0.123M, 0.456M, 0.345M, null, 0.2M, 0.01M, null, 0.367M };

var grouped = values.GroupBy(x => x.HasValue ? (decimal?)Math.Round(x.Value, 1) : null);

foreach (var group in grouped)
{
    Console.WriteLine("Group {0} has these members:", group.Key == null ? "Null" : group.Key.ToString());
    foreach (var groupMember in group)
    {
        Console.WriteLine("> {0}", groupMember == null ? "Null" : groupMember.ToString());
    }
}

Это сохраняет значения null, отображая их в группу с помощью клавиши null. Если вас это не волнует, вы можете сделать что-то вроде этого:

var grouped = values.Where(x => x.HasValue).Select(x => x.Value).GroupBy(x => Math.Round(x, 1));

чтобы все было не обнуляемым decimal.

0 голосов
/ 05 января 2012

вы используете оператор linq для выполнения Math.Round (x, 0); ? в противном случае это звучит так, как будто вы должны сделать System.Math.Round (x, 0); также x объявлен как двойное или десятичное число? нужно посмотреть, как на самом деле выглядит ваш код, пожалуйста ..

...