将值从字典复制到字典而不是地址

时间:2018-06-23 11:18:56

标签: c# dictionary value-type reference-type

我正在尝试将值从一个字典复制到另一个字典,因此当在新字典中更改该值时,它不会更改旧值。现在,我相信我是在复制地址。

 public Cube Right(Cube cube) {
        Dictionary<SidePosition, Side> newSides = new Dictionary<SidePosition, Side>(cube.Sides);

        for (int i = 0;  i < RightSideOrder.Count; i++) {
            for (int j = 0; j < RightFaceOrder.Count; j++) {
                newSides[RightSideOrder[i]].Faces[RightFaceOrder[j]] =
                    cube.Sides[RightSideOrder[GetAntecedantSideIndex(i)]]
                    .Faces[RightFaceOrder[j]];
            }
        }
        return cube;
    }

    private int GetAntecedantSideIndex(int currentIndex) {
        if (currentIndex == 0)
            return 3;
        return currentIndex - 1;
    }
}

Cube及其包含在Side字典中的值都是结构。我是C#的新手,所以如果命名约定不对,我深感抱歉。

根据我的研究/与人们交谈,该解决方案可能涉及ICloneable或新的IDictionary实现,但到目前为止,这两种方法都还没有运气。

如果需要更多详细信息,可以在这里找到完整的项目:https://github.com/Gregam3/RubicksCubeSolver

代码摘录来自一个名为CubeManipulator的类

TLDR;如何从字典中获取值作为值类型

2 个答案:

答案 0 :(得分:0)

遵循此article

您可以使用深度复制操作

  

执行深度复制操作时,克隆的Person对象,   包括其Person.IdInfo属性在内,无需修改即可   影响原始对象。

类似的东西:

public class SidePosition
{
    public IdInfo IdInfo;

    public SidePosition DeepCopy()
    {
       SidePosition other = (SidePosition) this.MemberwiseClone();
       other.IdInfo= new IdInfo(IdInfo.IdNumber);
       return other;
    }
}

public class Side
{
    public IdInfo IdInfo;

    public Side DeepCopy()
    {
       Side other = (Side) this.MemberwiseClone();
       other.IdInfo= new IdInfo(IdInfo.IdNumber);
       return other;
    }
}

public Cube Right(Cube cube) {
        Dictionary<SidePosition, Side> newSides = new Dictionary<SidePosition, Side>();
        foreach(var item in cube.Sides)
           newSides.Add(new SidePosition(item.key), new Side(item.value));

        //your logic
    }

答案 1 :(得分:0)

查看下面的链接以查看制作字典副本的示例,这样一来,更改一本词典中的值不会影响复制后的另一本词典:

Example of making a copy of a dictionary