为什么我的 IEnumerable 变量也更新了?

Sde*_*eee 0 c#

我有点困惑为什么这里的逻辑不起作用,我觉得我已经盯着这段代码太久了,以至于我在这里遗漏了一些东西。我有这个方法被另一个方法调用:

  private async Task<bool> Method1(int start, int end, int increment, IEnumerable<ModelExample> examples)
        {
                for (int i = start; i<= end; i++)
                {
                   ModelExample example = examples.Where(x => x.id == i).Select(i => i).First();
                   example.id = example.id + increment; //Line X
                   // do stuff

                }

                return true;

        }
Run Code Online (Sandbox Code Playgroud)

我调试了上面的代码,似乎当“Line X”执行时,不仅 example.id 单独更改,而且现在列表“examples”中的示例已更新为新的 id 值。我不知道为什么?我希望列表“examples”在整个 for 循环中保持不变,我很困惑为什么更新 example.id 的值也会在列表中更新它?

(即,如果“Line X”之前的列表有一个 id = 0 的条目,在“Line X”之后,同一条目的 id 更新为 1,我如何在此处保持变量“examples”不变?)

任何帮助表示赞赏,谢谢。

Hei*_*nzi 6

您的列表如下所示:

+---------------+   
| List examples |           +-----------+
+---------------+           |  Example  |
|               |           +-----------+
|     [0] --------------->  | Id: 1     |
|               |           | ...       |
+---------------+           +-----------+
|               |           
|     [1] --------------->  +-----------+
|               |           |  Example  |
+---------------+           +-----------+
|               |           | Id: 2     |
|     ...       |           | ...       |
|               |           +-----------+
+---------------+
Run Code Online (Sandbox Code Playgroud)

换句话说,您的列表仅包含对示例的引用,而不是副本。因此,您的变量example引用右侧的实体之一并就地修改它。

如果您需要副本,则需要自己创建一个