Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ和Contains更新匿名对象属性_C#_Linq_Anonymous Types - Fatal编程技术网

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

C# 如何使用LINQ和Contains更新匿名对象属性,c#,linq,anonymous-types,C#,Linq,Anonymous Types,我有两个匿名对象列表,如下所示 var persons = people.Select(x => new { Name = x.Name, Year = x.Value }); var years = yrs.Select(y => new { OldYear = y.Name, NewYear = y.Value }); 现在我想更新人员列表,这样,如果人员的任何年份作为旧年份存在于年份列表中,则需要使用新年值更新年份属性 这就是我现在做的老学校的方式 foreach(v

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

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

 var years = yrs.Select(y => new { OldYear = y.Name, NewYear = y.Value });
现在我想更新人员列表,这样,如果人员的任何年份作为旧年份存在于年份列表中,则需要使用新年值更新年份属性

这就是我现在做的老学校的方式

 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中是否有更简单/更好的方法根据一条LINQ语句中的另一个匿名列表更新人员列表?

您可以执行进一步的选择:

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; };

您可以执行进一步的选择:

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; };

改变内存中的数据;它不允许更新数据库中的数据。但这只会选择年龄列表中存在年龄的人(顺便说一句,该列表更新了称为“年”的Q以更清楚)。但是我还想从原始列表中选择年龄不在年龄列表中的所有人。你的陈述过滤了我不想要的人。@Marcinzabloki是的,如果有,我会否决这个答案。看起来很可能是一个LINQ查询正在查询数据库。问题中明确提到了更新现有内容而不是创建新序列,这是对该要求最有力的解释。@Servy good point,这也给了我一个问题——这是否可以使用匿名类型&linq更新数据库?@MarcinZablocki如果他知道的话,是的。如果他不知道这一点,那么解决他的问题就必须不使用匿名类型。这就是答案。这会改变内存中的数据;它不允许更新数据库中的数据。但这只会选择年龄列表中存在年龄的人(顺便说一句,该列表更新了称为“年”的Q以更清楚)。但是我还想从原始列表中选择年龄不在年龄列表中的所有人。你的陈述过滤了我不想要的人。@Marcinzabloki是的,如果有,我会否决这个答案。看起来很可能是一个LINQ查询正在查询数据库。问题中明确提到了更新现有内容而不是创建新序列,这是对该要求最有力的解释。@Servy good point,这也给了我一个问题——这是否可以使用匿名类型&linq更新数据库?@MarcinZablocki如果他知道的话,是的。如果他不知道这一点,那么解决他的问题就必须不使用匿名类型。这就是答案。