如何使用 LINQ 和 Contains 更新匿名对象属性

How to update anonymous objects property using LINQ and Contains

我有两个匿名对象列表如下

 var persons = people.Select(x => new { Name = x.Name, Year = x.Value });

 var years = yrs.Select(y => new { OldYear = y.Name, NewYear = y.Value });

现在我想更新人员列表,这样如果人员的任何年份在年份列表中作为旧年份存在,那么年份属性需要更新为 NewYear 值。

这就是我目前的老派做法

 foreach(var p in persons)
                {
                    if(years.Any(a => a.OldYear == p.Year))
                    {
                        p.Year = ages.Single(a => a.OldYear == p.Year).NewYear;  --> error
                    }
                }

这不起作用,因为编译器抱怨我无法设置匿名类型的只读属性 'Year'。

LINQ 中是否有 simpler/better 方法可以在一个 LINQ 语句中根据另一个匿名列表更新人员列表?

您可以进一步执行 Select:

var people = from p in persons
    let year = ages.Any(a=>a.NewYear==p.Year) ? ages.Single(a => a.OldYear == p.Year).NewYear : p.Year
    select new { Name = p.Name, Year = year; };