foreach循环中的C#更新对象

时间:2011-04-04 18:49:12

标签: c# foreach

我想说这是有效的,现在却不行。我不知道会发生什么变化。

        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循环之后,它就像我没有做任何事情。

- EDIT-- 好吧,我认为IsDirty会让所有人失望。我想把确切的代码,减去一些名称更改。但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;
        }

问题是“这不应该起作用吗?”我认为应该,如果不是为什么?我有这个工作,我不知道我改变了什么。我可以告诉你我的对象,但我必须修改这些名字,这将是毫无意义的。 IsDirty不是问题。我正在改变的值在循环内改变,但在循环外没有改变。

2 个答案:

答案 0 :(得分:6)

在您添加的说明中,您可以在y中创建副本并修改副本。

当列表项的类型是ValueType

时会发生这种情况

答案 1 :(得分:1)

我认为您的问题可能与GetByInstanceId有关。如果返回IEnumerable,那么您的foreach可能正在运行值并进行更改,但随后您对Single的调用将重复并丢失您的更改。您可能希望在ToList之后执行GetByInstanceId。当然,这是基于inquiry.S.Single().IsDirty是一个拼写错误并且应该是inquiry.Single().IsDirty的假设。否则我们需要更多信息。