更改List <T>中的一些值

Mit*_*nca 49 c# linq lambda expression

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

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

        foreach (MyClass mc in list)  
        {
            if (mc.Name == "height")
                mc.Value = 30;
        }
Run Code Online (Sandbox Code Playgroud)

这是linq查询(使用Lambda表达式),但它与上部foreach循环不同,它只返回列表中的1个项目(一行)!

我想要的是,它返回所有项目(所有行),并且只返回适当的项目(WHERE扩展方法中指定的项目).

list = list.Where(w => w.Name == "height").Select(s => { s.Value = 30; return s; }).ToList();
Run Code Online (Sandbox Code Playgroud)

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

McG*_*gle 103

你可以使用ForEach,但你必须将其转换IEnumerable<T>List<T>第一个.

list.Where(w => w.Name == "height").ToList().ForEach(s => s.Value = 30);
Run Code Online (Sandbox Code Playgroud)

  • 这将创建一个新列表。它切碎名称!=“高度”的项目 (2认同)

gmn*_*gmn 10

我可能会选择这个(我知道它不是纯粹的linq),如果你想保留所有项目,请保留对原始列表的引用,你应该发现更新的值在那里:

 foreach (var mc in list.Where(x => x.Name == "height"))  
     mc.Value = 30;
Run Code Online (Sandbox Code Playgroud)


dev*_*tal 6

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

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

扩展方法

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();
Run Code Online (Sandbox Code Playgroud)