Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 为什么我的更新没有持续?_C#_Linq - Fatal编程技术网

C# 为什么我的更新没有持续?

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,然后对每个数组执行嵌套的单步执行,

我有一个从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).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。

你能发布一个简短但完整的程序来说明问题吗?你能发布一个简短但完整的程序来说明问题吗?