在foreach循环中将项目添加到ObservableCollection中,会影响上级列表中的整个项目吗?

时间:2019-07-31 11:32:50

标签: c# foreach observablecollection

我会尽量简短。

我有一个名为Error的课程。此类包含名为Suggestions的属性,它是ObservableCollection<string>

在一种方法中,我使用LINQ语句创建了一个名为Error的{​​{1}}列表,然后对该列表进行了AllInstances循环。在循环内部,我向foreach对象的Suggestions集合中添加了一项。

问题是,在循环的每一圈,该项目都会添加到Error的所有成员中。因此,如果循环有3圈,则AllInstances的每个成员将添加3个项!

正常的行为应该是,每个AllInstances集合都添加了1个项目,而不是3个。

代码如下:

错误类别

Suggestions

方法代码

public class Error : INotifyPropertyChanged, ICloneable
    {
        public ObservableCollection<string> Suggestions { get; set; }
    }

这对我来说似乎很不合逻辑,以至于我高度怀疑这是我已经做过的事情,还是关于我尚不知道的类型结构的一些基本知识。

感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

好的,正如我在对该问题的最后评论中提到的那样,我研究了在某些需要的情况下克隆Error类的方式。原来我是在方法中像这样克隆对象:

public object Clone ()
        {
            return new Error
            {
                ...
                Suggestions = Suggestions,
                ...
            };
        }

我注意到Error类的其他所有属性都是默认类型(不可变?),例如stringintbool,唯一不同的是类型为ObservableCollection<string>的建议集合。我发现也许是因为其他属性都表现正确,并且没有引起引用同一实例的问题,所以该集合在设计上不同于其他实例,需要手动重新进行实例化。所以我做到了:

public object Clone ()
        {
            return new Error
            {
                ...
                Suggestions = new ObservableCollection<string>(Suggestions),
                ...
            };
        }

我只是在Clone方法中重新创建了属性,并且解决了在foreach循环中引用同一实例的问题。

我希望对代码有更深入了解的人能启发我和其他可能对此有所了解的人,让他们了解此问题的逻辑以及这些不变类型与ObservableCollection之间的区别。