ICollection ClearAndAddRange分享参考?

时间:2015-10-07 10:35:57

标签: c# reference icollection

我有两个ICollection列表fullListdisplayList

private void method()
{
    if(condition != null) {
        displayList.Clear();
        if(fullList.Count() > 0)
        {
            displayList.ClearAndAddRange(
                           fullList.Where(x=>x.conditionID == condition.conditionID));

        }
    }

}

我目前面临的问题是每当我更新displayList中的某个值时,fullList也会更新。这是预期的行为吗?

修改它的最佳方法是什么,以便它们不会在两者之间共享引用?

1 个答案:

答案 0 :(得分:1)

这确实是预期的行为。请考虑以下两个列表:

var list1 = new[] { myObj1, myObj2 };
var list2 = list1;

list2[0].myProp = 3;

其中myObj1myObj2MyClass的实例。

由于list1list2共享对包含对象的相同引用,对这些项目中的任何项目所做的所有修改也将反映在另一个列表中。当你想避免这种行为时,你必须提供一个深层拷贝,它将创建一个对象的新实例:

var list2 = list1.Select(x => new MyClass { ... });

有关深度克隆的详细信息,请参阅this post