gpt4 book ai didi

c# - 为什么我不能用三元运算符给小数赋值?

转载 作者:行者123 更新时间:2023-11-30 19:12:14 25 4
gpt4 key购买 nike

我有一个包含小数和整数 ID 的对象列表(使用匿名类型),我正在构建一个函数来计算列表中所有唯一对象中包含的小数的总和。

这是我写的代码行:

var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;

但是,它总是返回值为 0 的小数,即使它应该返回总和 - 在我的示例中 objectList 包含五个相同的对象,因此它应该返回 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 函数,将结果的每个数据行转换为匿名类型对象,该对象在列表中返回。实际上,我一直无法弄清楚如何手动构建这些对象的列表。

另一个更新:使用下面 Reed Copsey 的回复,我以一种复制我得到的列表的方式手动创建了列表,并且我可以用手动创建的列表重现错误:

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。我设置断点的行没有访问或修改变量。

这两条线似乎都有效,但调试器显示它无效,直到我在代码后移动了至少两行。我以前从未遇到过这种情况,但它表明代码确实有效。

最佳答案

你的说法没有问题。

问题出在其他地方,很可能是您如何构建 objectList

例如,下面的代码完全按预期工作,并打印“0.6”(正如预期的那样):

namespace Test
{
using System;
using System.Linq;

internal class TestCompile
{
private static void Main(string[] args)
{
var objectList = Enumerable.Range(0, 3).Select(i => new { ID = i, DecimalValue = i / 5.0m }).ToList();

decimal result = objectList.Any() ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;

Console.WriteLine(result);
Console.ReadKey();
}
}
}

更新:

响应您的更新,这也很完美:

private static void Main(string[] args)
{
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;

Console.WriteLine(result);
Console.ReadKey();
}

它使用您粘贴的确切代码,并按预期报告 31.45(由于唯一约束)。请注意,就我个人而言,我会使用 31.45m 而不是强制转换,但它甚至可以像编写的那样工作...

关于c# - 为什么我不能用三元运算符给小数赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com