我有一個型別的物件。
class A
{
public int Id{get;set;}
public decimal? Num {get;set;}
}
然后我List<A> objList從 db 填充了資料。我需要將 Num 設為正數,因此我嘗試執行以下操作。
objList = objList.ForEach(x=>x.Num = Math.Abs(x.Num));
由于 Num 是可為空的 decimal ,因此我無法在 Linq 中使用它。如何使用它以便我可以跳過空值并使用 Math.abs 將 -ve 值轉換為 ve 值?
uj5u.com熱心網友回復:
我不會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。
(請參閱Eric Lippert 在 foreach 與 ForEach 上的帖子,了解為什么不應該使用List<T>.ForEach()來改變串列的一些討論。)
uj5u.com熱心網友回復:
ForEach是不是LINQ的一部分,而是一個定義的方法上List<T>,它回傳void(所以你不能給它分配的結果objList,即objList = objList.ForEach)。
您可以使用三元運算子檢查是否x.Num具有值并將該值用于Math.Abs:
objList.ForEach(x => x.Num = x.Num.HasValue ? Math.Abs(x.Num.Value) : null);
uj5u.com熱心網友回復:
ForEach不是 LINQ,它是一個實體方法,List<T>用于更新串列。
您可以使用三元運算式僅Math.Abs在Num不為空時應用:
objList.ForEach(x => x.Num = x.Num is decimal d ? Math.Abs(d) : null);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/381693.html
