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)
小智 12
尝试:
myList .Where(w=> w.Name == "dTomi").ToList().ForEach(i => i.Marks = 35);
Run Code Online (Sandbox Code Playgroud)
小智 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)
正如其他人所指出的那样,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仅查询.
| 归档时间: |
|
| 查看次数: |
71428 次 |
| 最近记录: |