Change some value inside the List

前端 未结 7 1359
甜味超标
甜味超标 2020-12-07 22:23

I have some list (where T is a custom class, and class has some properties). I would like to know how to change one or more values inside of it by using Lambda Expressions,

相关标签:
7条回答
  • 2020-12-07 22:34

    You can do something like this:

    var newList = list.Where(w => w.Name == "height")
                  .Select(s => new {s.Name, s.Value= 30 }).ToList();
    

    But I would rather choose to use foreach because LINQ is for querying while you want to edit the data.

    0 讨论(0)
  • 2020-12-07 22:44

    This is the way I would do it : saying that "list" is a <List<t>> where t is a class with a Name and a Value field; but of course you can do it with any other class type.

        list = list.Where(c=>c.Name == "height")
            .Select( new t(){Name = c.Name, Value = 30})
            .Union(list.Where(c=> c.Name != "height"))
            .ToList();
    

    This works perfectly ! It's a simple linq expression without any loop logic. The only thing you should be aware is that the order of the lines in the result dataset will be different from the order you had in the source dataset. So if sorting is important to you, just reproduce the same order by clauses in the final linq query.

    0 讨论(0)
  • 2020-12-07 22:52

    How about list.Find(x => x.Name == "height").Value = 20; This works fine. I know its an old post, but just wondered why hasn't anyone suggested this? Is there a drawback in this code?

    0 讨论(0)
  • 2020-12-07 22:53

    You could use a projection with a statement lambda, but the original foreach loop is more readable and is editing the list in place rather than creating a new list.

    var result = list.Select(i => 
       { 
          if (i.Name == "height") i.Value = 30;
          return i; 
       }).ToList();
    

    Extension Method

    public static IEnumerable<MyClass> SetHeights(
        this IEnumerable<MyClass> source, int value)
    {
        foreach (var item in source)
        {
           if (item.Name == "height")
           {
               item.Value = value;
           }
    
           yield return item;
        } 
    }
    
    var result = list.SetHeights(30).ToList();
    
    0 讨论(0)
  • 2020-12-07 22:55

    You could use ForEach, but you have to convert the IEnumerable<T> to a List<T> first.

    list.Where(w => w.Name == "height").ToList().ForEach(s => s.Value = 30);
    
    0 讨论(0)
  • 2020-12-07 22:56

    I'd probably go with this (I know its not pure linq), keep a reference to the original list if you want to retain all items, and you should find the updated values are in there:

     foreach (var mc in list.Where(x => x.Name == "height"))  
         mc.Value = 30;
    
    0 讨论(0)
提交回复
热议问题