使用linq更新对象集合中的属性

时间:2013-08-15 20:14:34

标签: c# linq

具有对象结构的对象列表,如下所示

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();

4 个答案:

答案 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();