c# - 意外修改字典
问题描述
谁能向我解释为什么当我创建字典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];
}
}
在此代码之后,字典已修改值。
解决方案
数组(如 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;
推荐阅读
- python - 如何将列表列表转换为python中的特定数据框
- visual-studio - 在 Windows 下通过 CMake 使用预编译的 HDF5 库
- angular - 如何将数据从一个组件发送到另一个不是子/父的组件以显示消息(闪存消息)
- javascript - 无法单击生成的元素?
- java - 一些错误,例如令牌“;”上的语法错误,@预期
- php - 如何将计算/公式字段添加到 Doctrine 实体中?
- java - AppCompat 如何膨胀未明确使用 AppCompat 小部件的布局?
- liferay - 如何在 Liferay DXP 的服务器级别禁用构建命名空间测试的日志
- xaml - Telerik UI For UWP TimePicker Step 属性
- angular - 装饰器不支持函数调用(Angular 8)