使用System.Linq.Dynamic时如何舍入可为空的十进制值

时间:2012-01-04 21:15:44

标签: c# linq math dynamic dynamic-linq

当我尝试使用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 个答案:

答案 0 :(得分:1)

您的问题是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

答案 1 :(得分:0)

你使用linq语句来做Math.Round(x,0); ? 如果不是这听起来你将不得不做System.Math.Round(x,0); aslo是x声明为double或decimal。?需要看看你的代码实际上是什么样的..