5

具有对象结构如下的对象列表

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”。谁能看到这有什么问题?

循环遍历集合并尝试更改属性也不会更改它

   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

4 回答 4

4

您的 LINQ 查询分配一个值以schedule基于原始集合创建独立对象(它有效地克隆对象);更改克隆的属性不会更改原始对象。

于 2013-08-15T20:18:02.120 回答
3

该代码有效 - 在执行 schedule.ForEach() 后,Name 属性被更新。也许有些东西你遗漏了。

于 2013-08-15T20:55:39.670 回答
3

LINQ 不是修改集合的正确工具,它是查询集合的工具。如果你想修改它,你需要一个循环,例如foreach

var schedule = data.Select(d => new Schedule{ ID = d.id }).ToList();
foreach(var s in schedule)
    s.Name = "Condition Name";

如果你想用 LINQ“修改”一个集合,你必须创建一个新集合并将其分配给你的变量,这是低效的。

于 2013-08-15T20:17:19.290 回答
0

下面,您将创建新的Schedules而不设置其Name.

var schedule = (from d in data 
                select new Schedule
                {
                    ID = d.id
                }).ToList();

首先,您可能想给新SchedulesName

var schedule = (from d in data 
                select new Schedule
                {
                    ID = d.id,
                    Name = d.NameProperty /* Switch out with real name property */
                }).ToList();
于 2013-08-15T20:22:17.033 回答