在可为 null 的小数 属性 上使用 Math.Abs

Using Math.Abs on nullable decimal property

我有一个类型的对象。

class A
{
    public int Id{get;set;}
    public decimal? Num {get;set;}
}

然后我从 db 填充了 List<A> objList 数据。 我需要将 Num 设为正数,所以 我尝试执行以下操作。

objList = objList.ForEach(x=>x.Num = Math.Abs(x.Num));

由于 Num 是 nullable decimal ,我无法在 Linq 中使用它。我如何使用它,以便我可以跳过空值并使用 Math.abs?

将 -ve 值转换为 +ve 值

ForEach 不是 LINQ,it's an instance method on List<T> 会更新列表。

您可以使用三元表达式仅在 Num 不为空时应用 Math.Abs

objList.ForEach(x => x.Num = x.Num is decimal d ? Math.Abs(d) : null);

ForEach 不是 LINQ 的一部分,而是 List<T> 上的 method defined 和 returns void(因此您不能分配它的结果到 objListobjList = objList.ForEach ).

您可以使用 ternary operator 检查 x.Num 是否具有值并将该值用于 Math.Abs:

objList.ForEach(x => x.Num = x.Num.HasValue ? Math.Abs(x.Num.Value) : null);

我不会使用 List<T>.ForEach() 来改变列表。相反,我会使用一个简单的 foreach 循环,如下所示:

foreach (var item in objList.Where(item => item.Num != null))
{
    item.Num = Math.Abs(item.Num!.Value);
}

注意:如果使用可空检查,则必须使用 ! 来抑制 item.Num!.Value 中的警告,因为编译器不够智能,无法识别 Where它不能为空。

另请注意,此方法避免了将 null 冗余分配给已为空的 Num,而这种情况发生在其他解决方案中。

(有关为什么不应使用 List<T>.ForEach() 改变列表的一些讨论,请参阅 Eric Lippert's post on foreach vs ForEach。)