【问题标题】:ICollection ClearAndAddRange share reference?ICollection ClearAndAddRange 共享参考?
【发布时间】:2015-10-07 10:35:56
【问题描述】:

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

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

【问题讨论】:

  • ICollection 没有这种方法。它是某种自定义实现吗?您是否将相同的实例分配给不同的变量?
  • 使用带有 '.select(x => new {...})' 的投影。如果不知道您的收藏包含什么,我无法编写代码。

标签: c# reference icollection


【解决方案1】:

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

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

list2[0].myProp = 3;

其中myObj1myObj2MyClass 的实例。

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

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

有关深度克隆的更多信息,另请参阅this post

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2020-08-24
    • 2020-09-11
    • 2020-07-21
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多