C# 将项目添加到foreach循环中的ObservableCollection,是否会影响上层列表中的整个项目?

C# 将项目添加到foreach循环中的ObservableCollection,是否会影响上层列表中的整个项目?,c#,foreach,observablecollection,C#,Foreach,Observablecollection,我会尽量简短 我有一个名为Error的类。此类包含名为建议的属性,该属性是可观察集合 在一种方法中,我使用LINQ语句创建名为AllInstances的Errors列表,然后在该列表上执行foreach循环。在循环中,我向Error对象的Suggestions集合添加了一项 问题是在循环的每一圈中,该项都会添加到AllInstances的所有成员中。因此,如果循环有3圈,则AllInstances的每个成员都将添加3项 正常行为应该是每个建议集合中添加1项,而不是3项 代码如下: 错误类别 pu

我会尽量简短

我有一个名为
Error
的类。此类包含名为
建议
的属性,该属性是
可观察集合

在一种方法中,我使用LINQ语句创建名为
AllInstances
Error
s列表,然后在该列表上执行
foreach
循环。在循环中,我向
Error
对象的
Suggestions
集合添加了一项

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

正常行为应该是每个
建议
集合中添加1项,而不是3项

代码如下:

错误类别

public class Error : INotifyPropertyChanged, ICloneable
    {
        public ObservableCollection<string> Suggestions { get; set; }
    }
公共类错误:INotifyPropertyChanged,可克隆
{
公共可观察收集建议{get;set;}
}
方法的代码

List<Error> AllInstances = (from paragraph in DocRef.LatestState
                            from error in paragraph.Errors
                            where error.Word == sourceError.Word
                            select error).ToList();

foreach (Error _er in AllInstances)
    {
        _er.Suggestions.Add(newSuggestion);
    }

// At this point, if "AllInstances.Count" was 3, every "_er.Suggestions" in "AllInstances"
// will also have 3 items in it!
List AllInstances=(来自DocRef.LatestState中的段落
从段落中的错误。错误
其中error.Word==sourceError.Word
选择错误);
foreach(所有指令中的错误)
{
_添加(新建议);
}
//此时,如果“AllInstances.Count”为3,则“AllInstances”中的每个“\u er.Suggestions”
//也将有3个项目在它!
这对我来说似乎不合逻辑,以至于我高度怀疑这是我做过的事情,或者是关于类型结构的一些基本问题,我还不知道


谢谢你的帮助。谢谢。

好的,正如我在上次对这个问题的评论中提到的,我在一些需要克隆
Error
类的实例中研究了克隆该类的方法。结果是我在方法中克隆了如下对象:

public object Clone ()
        {
            return new Error
            {
                ...
                Suggestions = Suggestions,
                ...
            };
        }
我注意到,
Error
类的所有其他属性都是默认类型(不可变?),如
string
int
bool
,唯一不同的是类型
observedcollection
的建议集合。我认为,可能是因为其他属性的行为都是正确的,并且没有引起引用同一实例的问题,所以这个集合在设计上与其他集合不同,需要手动重新实例化。我就这样做了:

公共对象克隆()
{
返回新错误
{
...
建议=新的可观察收集(建议),
...
};
}
我只是在
Clone
方法中重新创建了属性,就解决了在foreach循环中引用同一实例的问题


我希望对代码有更深入了解的人能够启发我和其他可能偶然发现这个问题的人,让他们了解这个问题的逻辑,以及这些不可变类型和
可观察集合

newSuggestion对象是一个列表吗?@SachinVishwakarma不,“newSuggestion”只是一个字符串,由于
建议
集合本身属于
类型。您确定每个错误都有自己的建议吗?似乎每个错误都是同一个集合。@PablonotPicasso我可以像我的代码所说的那样确定。“看起来”它们是一样的,但代码在程序的其他每个部分都工作得很好。到目前为止,这个foreach循环是唯一导致错误的地方。您能检查一下您的LINQ查询没有返回三次相同的错误实例吗?如果多个段落共享错误实例,则这可能是原因。
ObservableCollection
是一种可变引用类型。如果不克隆它,则现在有两个引用指向同一个集合。把它想象成一个盒子。如果你看着这个盒子,在上面加上一些东西,你就会看到它。现在我开始看盒子。当你给它添加一些东西时,我也看到了。这是因为我们都在看同一个盒子。使用
newobservedcollection
是有效的,因为你可以取而代之的是,去拿一个新的盒子,把里面所有东西的副本放进去。现在你看的是一个盒子,我看的是另一个盒子。@mjwills感谢你简单而准确的解释。我的猜测似乎是正确的,但我只是不知道哪些类型是不变的,哪些类型不是不变的。既然你已经澄清了,这确实是一个重复的问题,对不起!