如何使用LINQ更新List中的值

use*_*024 3 .net c# linq list c#-4.0

我有一个列表,我想用LINQ更新.

class Student
{
    private string name;
    private int marks;
    public string Name { get; set;}
    public int Marks { get; set; }
    public Student(string name, int marks)
    {
        Name = name;
        Marks = marks;
    }
}

List<Student> myList = new List<Student>();
myList.Add(new Student("John", 10));
myList.Add(new Student("Tom", 20));
Run Code Online (Sandbox Code Playgroud)

现在我想使用LINQ更新列表,以便只更新John的标记.我使用以下语法:

myList.Where(w => w.Name == "Tom").Select(w=> { w.Marks = 35; return w});
Run Code Online (Sandbox Code Playgroud)

但这不会更新myList中的数据.有人能告诉我哪里出错了.

das*_*ght 22

LINQ用于查询,而不是用于更新数据.使用LINQ获取要修改的项目,然后在foreach循环中修改它们:

foreach ( var tom in myList.Where(w => w.Name == "Tom")) {
    tom.Marks = 35;
}
Run Code Online (Sandbox Code Playgroud)

演示.

  • 这不应该给出错误.这是非常好的代码,并进行修改,不太确定downvote. (7认同)
  • 这会产生错误 - 无法修改“item”的成员,因为它是“foreach 迭代变量” (2认同)

小智 12

尝试:

myList .Where(w=> w.Name  == "dTomi").ToList().ForEach(i => i.Marks  = 35);
Run Code Online (Sandbox Code Playgroud)

  • 这并不能解释任何事情,而OP正在询问他们做错了什么。当纯代码答案还包含解释时,它们会更有价值。 (4认同)

小智 9

Select()与任何其他 LINQ 方法一样,不会更改源集合,而是返回一个新集合。

因此,您应该将该新集合分配给myList

myList = myList.Where(w => w.Name == "Tom").Select(w => { w.Marks = 35; return w}).ToList();
Run Code Online (Sandbox Code Playgroud)

Marks在单独的 foreach 循环中分配属性

myList.Where(w => w.Name == "Tom").ToList().ForEach(w => w.Marks = 35);
Run Code Online (Sandbox Code Playgroud)


Hab*_*bib 5

正如其他人所指出的那样,LINQ用于查询数据,而不是用于更新.

您应该迭代列表,并修改您的值,如:

foreach (var student in myList)
{
    if (student.Name == "Tom")
    {
        student.Marks = 35;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

foreach (var student in myList.Where(r => r.Name == "Tom"))
{
    student.Marks = 35;
}
Run Code Online (Sandbox Code Playgroud)

无论你认为什么更好地传达了意图用途.


但这是一件有趣的事:

如果您有以下声明:

myList.Where(w => w.Name == "Tom").Select(w => w.Marks = 35).ToList();
Run Code Online (Sandbox Code Playgroud)

如果不将结果分配回myList上述查询,将修改原始列表中的值.请记住,这是副作用,并不是更新的正确方法.这是修改可以通过传递给方法并在那里进行修改的引用参数来解释.但重要的是,应始终避免这种情况.这是一种不好的做法,可能导致真正令人困惑的代码.使用LINQ仅查询.

  • +1 这指出了一个让我发疯的重要点,因为许多帖子都提供了你的反模式作为答案,我想知道我是否正确理解了 LINQ 中的 Q。谢谢 :-) (4认同)