c#在foreach循环中更新对象

本文关键字:更新 对象 循环 foreach | 更新日期: 2023-09-27 17:48:59

我想说这是工作,现在它不是。我不知道会有什么改变。

        var inquiry = repo.GetByInstanceId(2);
        foreach (var s in inquiry.Prop)
        {
            s.Prop = "Test 1 2 3...";
        }
        Assert.AreEqual(true, inquiry.S.Single().IsDirty, "S Should Be Dirty");

发生的事情是在Property对象被更新之前,一切都是盛大的。现在,属性在foreach循环中被更新,但是在foreach循环之后,就像我什么都没做一样。

——编辑好吧,我觉得脏脏把所有人都甩了。我想把准确的代码,减去一些名称更改。但是IsDirty在这里并不重要。

我所做的事情的基本表示是这样的:

        class test { public int check { get; set; } }
        var x = new List<test>();
        x.Add(new test(){ check = 1});
        foreach (var y in x)
        {
            y.check = 5;
        }

问题是"这不应该工作吗?"我认为应该,如果不是,为什么?我让它工作,我不知道我改变了什么。我可以给你看我的物品,但是我必须修改它们的名字,这样就没有意义了。脏不是问题。我要改变的值是在循环内改变,而不是在循环外改变。

c#在foreach循环中更新对象

在您添加的解释中,您在y中创建了一个副本并修改了副本。

当列表项的类型为ValueType

时,会发生这种情况

我想你的问题可能与GetByInstanceId有关。如果它返回一个IEnumerable,那么很可能您的foreach正在遍历值并进行更改,但是随后您对Single的调用会重复并丢失更改。你可能想在GetByInstanceId之后做一个ToList。当然,这是基于inquiry.S.Single().IsDirty是一个错字,应该是inquiry.Single().IsDirty的假设。否则我们需要更多的信息。