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

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

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