首页 > 解决方案 > 意外修改字典

问题描述

谁能向我解释为什么当我创建字典Dictionary<char, char[]> dictionary然后我用一些对象初始化这个字典。初始化后,我想根据更改的值获取一些键:

    for (int i = 0; i < text.Length; i += 2)
    {
        try
        {
            char[] firstValue = new char[]{};
            char[] secondValue = new char[]{};
            dictionary.TryGetValue(text[i], out firstValue);
            dictionary.TryGetValue(text[i + 1], out secondValue);

            char temp = firstValue[4];
            firstValue[4] = secondValue[0];
            secondValue[0] = temp;

            newString += dictionary.First(x => x.Value == firstValue).Key;
            newString += dictionary.First(x => x.Value == secondValue).Key;
        }
        catch (Exception e)
        {
            newString += text[i];

        }
    }

在此代码之后,字典已修改值。

标签: c#algorithm

解决方案


数组(如 char[])是一种引用类型,因此firstValue指向存储在字典中的同一个对象,因此当您更改一个对象时,另一个也会被修改。如果你想要一个副本,你可以使用Array.Copy. 另外,如果你想比较数组的值是否相同,你应该使用SequenceEquals而不是==,因为这将检查引用是否相同,另一个通过使用默认值比较元素来确定两个序列是否相等他们的类型的相等比较器。

char[] firstValueTemp;
char[] secondValueTemp;
char[] firstValue;
char[] secondValue;
dictionary.TryGetValue(text[i], out firstValue);
dictionary.TryGetValue(text[i + 1], out secondValue);
Array.Copy(firstValueTemp, firstValue, firstValueTemp.Length);
Array.Copy(secondValueTemp, secondValue, secondValueTemp.Length);
char temp = firstValue[4];
firstValue[4] = secondValue[0];
secondValue[0] = temp;

newString += dictionary.First(x => x.Value.SequenceEqual(firstValue)).Key;
newString += dictionary.First(x => x.Value.SequenceEqual(secondValue)).Key;

推荐阅读