为什么我的更新不能持续?

本文关键字:不能 我的 更新 为什么 | 更新日期: 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,然后你正在改变数组的一部分(然后扔掉数组)。这就是为什么第二个语句可以编译,而第一个语句不能。