具有对象结构的对象列表,如下所示
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();
稍后在代码中我想更改属性名称取决于条件。我找到的几个例子
schedule.ForEach(s => { s.Name = "Condition Name"; });
schedule.Select(s => { s.Name = "Condition name"; return s; });
执行后,在监视窗口中刷新计划时,将名称参数“null”保留。 有人能看出这有什么问题吗?
循环收集并尝试更改Property也不会改变它
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();
答案 0 :(得分:4)
为schedule
分配值的LINQ查询会根据原始集合创建独立对象(它有效克隆对象);更改克隆的属性不会更改原始对象。
答案 1 :(得分:3)
LINQ不是修改集合的正确工具,它是查询集合的工具。如果要修改它,则需要一个循环,例如foreach
:
var schedule = data.Select(d => new Schedule{ ID = d.id }).ToList();
foreach(var s in schedule)
s.Name = "Condition Name";
如果要使用LINQ“修改”集合,则必须创建一个新集合并将其分配给低效的变量。
答案 2 :(得分:3)
代码有效 - 执行schedule.ForEach()后,Name属性会更新。也许有些东西你已经遗漏了。
答案 3 :(得分:0)
下面,您创建新的Schedules
而未设置其Name
。
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();