在可为 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
(因此您不能分配它的结果到 objList
即 objList = 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。)
我有一个类型的对象。
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
(因此您不能分配它的结果到 objList
即 objList = 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。)