Копировать значение из словаря в словарь, а не в адрес - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь скопировать значения из одного словаря в другой, поэтому, когда это значение изменяется в новом словаре, оно не меняет старое значение. Прямо сейчас я считаю, что вместо этого копирую адрес.

 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 голосов
/ 23 июня 2018

Просмотрите приведенную ниже ссылку, чтобы увидеть пример создания копии словаря, чтобы изменение значений в одном словаре не повлияло на другое после копирования:

Пример создания копии словаря

0 голосов
/ 23 июня 2018

После этого статья

Вы можете использовать операцию глубокого копирования

при выполнении операции глубокого копирования клонированный объект 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
    }
...