收集ClearAndAddRange共享引用

本文关键字:引用 共享 ClearAndAddRange 收集 | 更新日期: 2023-09-27 18:16:44

我有两个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也会更新。这是预期行为吗?

什么是最好的方法来修改它,使它们之间不会共享引用?

收集ClearAndAddRange共享引用

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

var list1 = new[] { myObj1, myObj2 };
var list2 = list1;
list2[0].myProp = 3;

其中myObj1myObj2MyClass的实例。

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

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

有关深度克隆的更多信息,请参阅这篇文章