意外修改字典

时间:2018-08-20 12:58:41

标签: c# algorithm

任何人都可以向我解释为什么创建字典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];

        }
    }

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

1 个答案:

答案 0 :(得分:2)

数组(如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;