为什么我的更新不能持续?
本文关键字:不能 我的 更新 为什么 | 更新日期: 2023-09-27 18:04:28
我有一个从linq查询填充的匿名类型(grps)。其中一个字段(DYs)包含一个数组。
如果我运行这段代码:
grps.ElementAt(0).Product = "kkk";
我得到一个编译错误。
如果我运行这段代码,我没有得到错误,但值是不变的。
grps.ElementAt(0).DYs[0] = 19;
Console.WriteLine(grps.ElementAt(0).DYs[0]); // not 19
但是,如果在grps上执行foreach操作,然后对每个数组执行嵌套步骤,则可以更改数组的值,并在嵌套循环中报告更改后的值。在嵌套循环之外,它们仍然保持不变。
我需要在我的匿名类型中更改数组中的值,但我不知道如何更改。
这让我很恼火和困惑,因为我花了很多时间来编写我认为工作正常的代码,但结果却没有产生任何错误。
更新
这样做的结果是,像往常一样,当我遇到问题时,这是因为我忘记将ToList()粘贴在某些内容的末尾。
是的,对于第一个,你会得到一个编译错误-你试图在匿名类型中设置属性,而你不能在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]);
it 将打印出19.
为什么我的更新不持久?
除非在linq查询中使用.ToList()
之类的东西,否则每次调用ElementAt(0)
都会生成不同的序列。
grps
的定义是这里的关键…如果是linq…那是你的问题。
为什么一个编译,而另一个不编译?
你正在请求一个数组.DYs
,然后你正在改变数组的一部分(然后扔掉数组)。这就是为什么第二个语句可以编译,而第一个语句不能。