skip to Main Content

I have a object of type.

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

Then I have List<A> objList data populated from db .
I need to make Num as positive number , so
I tried to do the following.

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

Since the Num is nullable decimal , I am not able to use it in Linq. How Can I use it so that I can skip null values and convert -ve values to +ve one using Math.abs?

3

Answers


  1. ForEach is not LINQ, it’s an instance method on List<T> which updates the list in place.

    You could use a ternary expression to only apply Math.Abs when Num is not null:

    objList.ForEach(x => x.Num = x.Num is decimal d ? Math.Abs(d) : null);
    
    Login or Signup to reply.
  2. ForEach is not part of LINQ but rather a method defined on List<T> and it returns void (so you can’t assign it’s result to objList i.e. objList = objList.ForEach ).

    You can use ternary operator with check for x.Num having value and use that value for Math.Abs:

    objList.ForEach(x => x.Num = x.Num.HasValue ? Math.Abs(x.Num.Value) : null);
    
    Login or Signup to reply.
  3. I wouldn’t use List<T>.ForEach() to mutate the list. Instead, I’d use a simple foreach loop like this:

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

    Note: If using nullable checking, you must use ! to suppress a warning in item.Num!.Value because the compiler isn’t smart enough to figure out that because of the Where it can’t be null.

    Also note that this approach avoids the redundant assignment of null to an already-null Num which occurs for the other solutions.

    (See Eric Lippert’s post on foreach vs ForEach for some discussion on why you shouldn’t use List<T>.ForEach() to mutate a list.)

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search