使用linq更新对象集合中的属性
本文关键字:属性 集合 对象 linq 更新 使用 | 更新日期: 2023-09-27 18:27:46
有一个对象列表,对象结构如下
public class Schedule
{
public int ID { get; set; }
public string Name { get; set; }
public Schedule() {}
}
对数据执行linq查询我可以看到正确填充的对象列表
var schedule = (from d in data
select new Schedule
{
ID = d.id,
Name = ""
}).ToList();
稍后在代码中,我想更改属性Name取决于一个条件。我发现的几个例子
schedule.ForEach(s => { s.Name = "Condition Name"; });
schedule.Select(s => { s.Name = "Condition name"; return s; });
执行后,当我在监视窗口中刷新计划时,将Name参数保留为"null"。有人能看出这是怎么回事吗?
循环收集并尝试更改属性也不会更改属性
foreach (var sch in schedule)
{
sch.Name = "New name";
}
schedule.ToList()[0].Name="
更新
下面代码段中的.ToList()调用对于使代码正常工作非常重要。
var schedule = (from d in data
select new Schedule
{
ID = d.id,
Name = ""
}).ToList();
为schedule
赋值的LINQ查询基于原始集合创建独立对象(它有效地克隆了对象);更改克隆的属性不会更改原始对象。
代码在执行计划后工作。ForEach()将更新Name属性。也许你遗漏了什么。
LINQ不是修改集合的合适工具,它是查询集合的工具。如果你想修改它,你需要一个循环,例如foreach
:
var schedule = data.Select(d => new Schedule{ ID = d.id }).ToList();
foreach(var s in schedule)
s.Name = "Condition Name";
如果你想用LINQ"修改"一个集合,你必须创建一个新的集合,并将其分配给你的变量,这是低效的。
下面,您将在不设置其Name
的情况下创建新的Schedules
。
var schedule = (from d in data
select new Schedule
{
ID = d.id
}).ToList();
首先,您可能需要给新的Schedules
一个Name
var schedule = (from d in data
select new Schedule
{
ID = d.id,
Name = d.NameProperty /* Switch out with real name property */
}).ToList();