关于c#:更改List< T>内的一些值

Change some value inside the List<T>

我有一些列表(其中t是一个自定义类,类有一些属性)。我想知道如何使用lambda表达式更改其中一个或多个值,因此结果将与下面的foreach循环相同:

注意:列表中包含多个项目(多行)

1
2
3
4
5
        foreach (MyClass mc in list)  
        {
            if (mc.Name =="height")
                mc.Value = 30;
        }

这就是LINQ查询(使用lambda表达式),但它与上foreach循环不同,它只从列表中返回1个项(一行)!

我想要的是,它返回所有项(所有行),并且只更改相应的项(在WHERE扩展方法中指定的项)。

1
list = list.Where(w => w.Name =="height").Select(s => { s.Value = 30; return s; }).ToList();

注意:这两个例子不一样!重复一遍,LINQ只返回1个项目(一行),这是我不想要的,我也需要列表中的所有项目(如foreach循环,它只做更改,但不删除任何项目)。


您可以使用ForEach,但必须先将IEnumerable转换为List

1
list.Where(w => w.Name =="height").ToList().ForEach(s => s.Value = 30);


我可能会这样做(我知道它不是纯LINQ),如果您想保留所有项目,请保留对原始列表的引用,并且您应该发现更新后的值在其中:

1
2
 foreach (var mc in list.Where(x => x.Name =="height"))  
     mc.Value = 30;


埃多克斯1〔6〕怎么样这个很好用。我知道这是一个古老的帖子,但我只是想知道为什么没有人建议这样做?这个代码有缺点吗?


您可以使用带有语句lambda的投影,但是原始的ForEach循环更可读,并且正在就地编辑列表,而不是创建新的列表。

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

扩展方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();


你可以这样做:

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

但我宁愿选择使用ForEach,因为LINQ用于查询而您想要编辑数据。