C# 为什么我的更新没有持续?
我有一个从linq查询填充的匿名类型(grps)。其中一个字段(DY)包含一个数组 如果我运行此代码:C# 为什么我的更新没有持续?,c#,linq,C#,Linq,我有一个从linq查询填充的匿名类型(grps)。其中一个字段(DY)包含一个数组 如果我运行此代码: grps.ElementAt(0).Product = "kkk"; 我得到一个编译错误 如果我运行这段代码,我不会得到任何错误,但值是不变的 grps.ElementAt(0).DYs[0] = 19; Console.WriteLine(grps.ElementAt(0).DYs[0]); // not 19 但是,如果我在GRP上执行foreach,然后对每个数组执行嵌套的单步执行,
grps.ElementAt(0).Product = "kkk";
我得到一个编译错误
如果我运行这段代码,我不会得到任何错误,但值是不变的
grps.ElementAt(0).DYs[0] = 19;
Console.WriteLine(grps.ElementAt(0).DYs[0]); // not 19
但是,如果我在GRP上执行foreach,然后对每个数组执行嵌套的单步执行,我可以更改数组的值,并在嵌套循环中报告这些值。在嵌套循环之外,它们仍然保持不变
grps.ElementAt(0).DYs[0] = 19;
Console.WriteLine(grps.ElementAt(0).DYs[0]); // not 19
我需要在匿名类型中对数组中的值进行更改,但我不知道如何更改
这让我感到恼火和困惑,因为我花了很多时间编写我认为可以正常工作的代码,但结果证明没有产生任何错误
更新 结果是,像往常一样,当我遇到问题时,这是因为我忘了将ToList()放在某个东西的末尾。为什么我的更新不能持久? 除非在linq查询中使用类似于
.ToList()
的内容,否则每次调用ElementAt(0)
都会生成不同的序列
GRP
的定义是这里的关键。。。如果是林克。。。那是你的问题
为什么一个编译,而另一个不编译?
您需要一个数组.DYs
,然后更改该数组的一部分(然后将该数组丢弃)。这就是为什么第二条语句可以编译,但第一条语句不能编译。为什么我的更新不能持久化?
除非在linq查询中使用类似于.ToList()
的内容,否则每次调用ElementAt(0)
都会生成不同的序列
GRP
的定义是这里的关键。。。如果是林克。。。那是你的问题
为什么一个编译,而另一个不编译?
您需要一个数组
.DYs
,然后更改该数组的一部分(然后将该数组丢弃)。这就是为什么第二条语句可以编译,但第一条语句不能编译。是的,第一条语句会出现编译错误-您试图在匿名类型中设置属性,而在C#中无法这样做。在第二种情况下,您并没有试图设置一个属性——您只是在改变一个数组。这是一个完全不同的操作-就像做一些事情一样:
private readonly StringBuilder builder = new StringBuilder("hello");
...
builder.Append("Stuff");
这将更改builder
引用的对象的内容;它不会更改builder
变量的值。匿名类型属性是只读的,因为您不能更改它们的值-但是如果该值是对可变对象的引用,您仍然可以更改该对象
现在,以第二种形式:调用ElementAt
两次。这意味着它将在第二次执行查询-创建一个新实例,从而创建一个新数组。您先前更改了其数组的对象已丢失。但是,如果您这样做:
var list = grps.ToList();
list[0].DYs[0] = 19;
Console.WriteLine(list[0].DYs[0]);
它将打印出19个。是的,第一个将出现编译错误-您试图在匿名类型中设置属性,而在C#中无法这样做。在第二种情况下,您并没有试图设置一个属性——您只是在改变一个数组。这是一个完全不同的操作-就像做一些事情一样:
private readonly StringBuilder builder = new StringBuilder("hello");
...
builder.Append("Stuff");
这将更改builder
引用的对象的内容;它不会更改builder
变量的值。匿名类型属性是只读的,因为您不能更改它们的值-但是如果该值是对可变对象的引用,您仍然可以更改该对象
现在,以第二种形式:调用ElementAt
两次。这意味着它将在第二次执行查询-创建一个新实例,从而创建一个新数组。您先前更改了其数组的对象已丢失。但是,如果您这样做:
var list = grps.ToList();
list[0].DYs[0] = 19;
Console.WriteLine(list[0].DYs[0]);
它将打印出19。你能发布一个简短但完整的程序来说明问题吗?你能发布一个简短但完整的程序来说明问题吗?