我有一个包含小数和整数ID的对象列表(使用匿名类型),并且我构建了一个函数来获取列表中所有唯一对象中包含的小数的总和。为什么我不能使用三元运算符为小数赋值?
这是代码行我写道:
var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;
然而,它总是返回与价值0
小数,即使它应该返回总和 - 链表类包含在我的例子中五个相同的对象,所以它应该返回DecimalValue。
如果我的这两行代码取代它,但是,它返回DecimalValue:
decimal result = 0;
if (objectList.Any()) result = objectList.Distinct().Sum(x => x.DecimalValue);
为什么在第二组线的工作,但第一线返回错误的值? objectList.Any()
是真的,所以它不应该使用虚假的分配。
更新:我使用这行代码产生的匿名类型的列表:
var objectList = _ms.Read(cmd, x => new { DecimalValue = x.Field<decimal>("SomeColumnName"), Id = x.Field<int>("SomeColumnId") }).ToList();
_ms
是MS SQL一个DAO,它的运行结果的每个数据行转换为lambda函数匿名类型对象,它在列表中返回。我实际上一直无法弄清楚如何手动建立这些对象的列表。
另一个更新:使用下面里德•科普塞的答复,我在重复那我得到的名单的方式手动创建的列表,我可以重现该错误与手动创建的列表:
var objectList = Enumerable.Range(0, 5).Select(i => new { DecimalValue = (decimal)31.45, Id = 3 }).ToList();
var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;
我也尝试删除转换为十进制,并且问题仍然存在。
另一个更新:经过一些进一步的调试后,我意识到我以前从未遇到过的东西。在我提到的每行都有问题的代码行之后,我立即设置了一个断点。对于解决方法,它返回31.45。对于问题行,它返回0.当我进入下一行时,再次查看变量,它说31.45。我设置断点的那一行没有访问或修改变量。
似乎两行都能正常工作,但是调试器显示它没有在代码之后移动至少两行。我从来没有遇到过,但它表明,代码确实工作。
我没有看到你的第一条语句有什么问题 - 结果应该是一样的 – BrokenGlass
在赋值之后'var result'的类型是什么?是否有可能C#从三元表达式中推断出不正确的类型(比如'int')? – climbage
'objectList'包含什么?如果你将它定义为'var objectList = new List {5,5,5,5};'由于你的三元表达式(显然删除了'DecimalValue'),我得到'5',所以它必须是与该类型有关。我们需要查看列表包含的内容。 –