使用 LINQ ForEach 设置列表属性值
Set list property value using LINQ ForEach
我正在使用下面的 linq 查询来设置 SecKey 的值,但我仍然在列表 studentData 中看到旧值,
下面是我正在使用的示例,它不是 working/not 设置值,
studentData.Where(w => w.ActiveDate.Date.Equals(otherObject.ActiveDate.Date) && w.EndDate.Date.Equals(otherObject.EndDate.Date)).ToList().ForEach(s => s.SecKey = secKey);
这里我整理了一些数据,
public struct Student
{
public string BadgeNum;
public DateTime ActiveDate;
public DateTime EndDate;
public decimal Amount;
public decimal? SecKey;
}
List<Student> students = new List<Student>();
students.Add(new Student() {
BadgeNum = "1"
,
ActiveDate = new DateTime(2014,4,4)
,
EndDate = new DateTime(2014, 5, 6)
,
Amount = 10
,
SecKey = 1
});
students.Add(new Student()
{
BadgeNum = "1"
,
ActiveDate = new DateTime(2014, 5, 6)
,
EndDate = new DateTime(2014, 5, 9)
,
Amount = 10
,
SecKey = 1
});
students.Add(new Student()
{
BadgeNum = "1"
,
ActiveDate = new DateTime(2014, 5, 9)
,
EndDate = new DateTime(2014, 6, 6)
,
Amount = 10
,
SecKey = 1
});
foreach (var b in students)
{
if (b.ActiveDate.Date.Equals(new DateTime(2014, 5, 9)) && b.EndDate.Date.Equals(new DateTime(2014, 6, 6)))
{
b.SecKey = 1;
}
}
在查询中执行 ToList 后,它将 return 新列表。
var newlist = studentData.Where(w => w.ActiveDate.Date.Equals(otherObject.ActiveDate.Date) && w.EndDate.Date.Equals(otherObject.EndDate.Date)).ToList();
newlist.ForEach(s => s.SecKey = secKey);
如果您想在不创建新列表的情况下实现目标,试试这个:
foreach (var student in studentData.Where(w => w.ActiveDate.Date.Equals(otherObject.ActiveDate.Date) && w.EndDate.Date.Equals(otherObject.EndDate.Date)))
{
student.SecKey = secKey;
}
编辑:这是在学生是 class
而不是 struct
的假设下创建的。
您有一个可变值类型,因此当您遍历集合时,您将复制所有项目并改变该副本,使列表中的值保持不变。
如果您想在此处继续使用值类型,则需要将变异值分配回列表中的相应位置。
实际上,您根本不应该在此处使用值类型,尤其应避免使用可变值类型,部分原因是例如此处的这种情况,您最终会在不知不觉中改变值的副本你打算改变。更好的解决方案是简单地将类型更改为 class
。
我正在使用下面的 linq 查询来设置 SecKey 的值,但我仍然在列表 studentData 中看到旧值,
下面是我正在使用的示例,它不是 working/not 设置值,
studentData.Where(w => w.ActiveDate.Date.Equals(otherObject.ActiveDate.Date) && w.EndDate.Date.Equals(otherObject.EndDate.Date)).ToList().ForEach(s => s.SecKey = secKey);
这里我整理了一些数据,
public struct Student
{
public string BadgeNum;
public DateTime ActiveDate;
public DateTime EndDate;
public decimal Amount;
public decimal? SecKey;
}
List<Student> students = new List<Student>();
students.Add(new Student() {
BadgeNum = "1"
,
ActiveDate = new DateTime(2014,4,4)
,
EndDate = new DateTime(2014, 5, 6)
,
Amount = 10
,
SecKey = 1
});
students.Add(new Student()
{
BadgeNum = "1"
,
ActiveDate = new DateTime(2014, 5, 6)
,
EndDate = new DateTime(2014, 5, 9)
,
Amount = 10
,
SecKey = 1
});
students.Add(new Student()
{
BadgeNum = "1"
,
ActiveDate = new DateTime(2014, 5, 9)
,
EndDate = new DateTime(2014, 6, 6)
,
Amount = 10
,
SecKey = 1
});
foreach (var b in students)
{
if (b.ActiveDate.Date.Equals(new DateTime(2014, 5, 9)) && b.EndDate.Date.Equals(new DateTime(2014, 6, 6)))
{
b.SecKey = 1;
}
}
在查询中执行 ToList 后,它将 return 新列表。
var newlist = studentData.Where(w => w.ActiveDate.Date.Equals(otherObject.ActiveDate.Date) && w.EndDate.Date.Equals(otherObject.EndDate.Date)).ToList();
newlist.ForEach(s => s.SecKey = secKey);
如果您想在不创建新列表的情况下实现目标,试试这个:
foreach (var student in studentData.Where(w => w.ActiveDate.Date.Equals(otherObject.ActiveDate.Date) && w.EndDate.Date.Equals(otherObject.EndDate.Date)))
{
student.SecKey = secKey;
}
编辑:这是在学生是 class
而不是 struct
的假设下创建的。
您有一个可变值类型,因此当您遍历集合时,您将复制所有项目并改变该副本,使列表中的值保持不变。
如果您想在此处继续使用值类型,则需要将变异值分配回列表中的相应位置。
实际上,您根本不应该在此处使用值类型,尤其应避免使用可变值类型,部分原因是例如此处的这种情况,您最终会在不知不觉中改变值的副本你打算改变。更好的解决方案是简单地将类型更改为 class
。