如何使用LINQ更新List中的值

我有一个列表,我想用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 myList = new List(); myList.Add(new Student("John", 10)); myList.Add(new Student("Tom", 20)); 

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

 myList.Where(w => w.Name == "Tom").Select(w=> { w.Marks = 35; return w}); 

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

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

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

演示。

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

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

 foreach (var student in myList) { if (student.Name == "Tom") { student.Marks = 35; } } 

要么

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

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


但这是一件有趣的事:

如果您有以下声明:

 myList.Where(w => w.Name == "Tom").Select(w => w.Marks = 35).ToList(); 

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

尝试:

 myList .Where(w=> w.Name == "dTomi").ToList().ForEach(i => i.Marks = 35); 

如何旧的好循环

 for(int i = 0; i < myList.Count; i++) if (myList[i].Name == "Tom") { myList[i].Marks = 35; break; } 

以及@dasblinkenlight代码应该可以工作,但你也可以尝试这样的东西

  var query = from x in list where x.Name = yourcondition select new { x }; foreach(var item in query) item.x.FieldToUpdate = SetValue; 

这有点笨重,但有效,并不依赖于传递参考。 它会根据旧的列表创建一个新列表。

 var myList=myList.Select(l=>new Student { l.Name, Marks=l.Name=="Tom"?35:l.Marks}).ToList(); 

或者更傻:

 var myList=myList.Where(l=>l.Name!="Tom").Union( myList.Where(l=>l.Name=="Tom").Select(l=>new Student { l.Name, Marks=35})).ToList(); 

对象通过引用存储在列表中,因此您可以通过linq恢复对象然后进行编辑,它将反映列表中的更改。

  static void Main(string[] args) { List testList = new List() { new Entity() {Id = 1, Text = "Text"}, new Entity() {Id = 2, Text = "Text2"} }; Console.WriteLine($"First text value:{testList[1].Text}"); Entity entityToEdit = testList.FirstOrDefault(e => e.Id == 2); if (entityToEdit != null) entityToEdit.Text = "Hello You!!"; Console.WriteLine($"Edited text value:{testList[1].Text}"); Console.ReadLine(); } internal class Entity { public int Id { get; set; } public String Text { get; set; } } 

测试应用程序,您将获得以下结果:

第一个文本值:Text2

编辑文字值:你好!

只需将值分配回集合即可实现上述目的

 myList = myList .Where(w => w.Name == "Tom") .Select(w=> { w.Marks = 35; return w}) .ToList();