C# 替换密码字母映射数据结构

C# 替换密码字母映射数据结构,c#,data-structures,C#,Data Structures,什么数据结构能更好地存储以下替换密码字母映射 abcdefghijklmnopqrstuvwxyz qpalzxmskwoeidjcnvbfhguryt 我目前正在使用两本词典,但一定有更简单的: char[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',

什么数据结构能更好地存储以下替换密码字母映射

abcdefghijklmnopqrstuvwxyz
qpalzxmskwoeidjcnvbfhguryt
我目前正在使用两本词典,但一定有更简单的:

char[] alphabet = {'a', 'b', 'c', 'd', 'e',
                   'f', 'g', 'h', 'i', 'j',
                   'k', 'l', 'm', 'n', 'o',
                   'p', 'q', 'r', 's', 't',
                   'u', 'v', 'w', 'x', 'y', 'z'};
char[] mappings = {'q', 'p', 'a', 'l', 'z',
                   'x', 'm', 's', 'k', 'w',
                   'o', 'e', 'i', 'd', 'j',
                   'c', 'n', 'v', 'b', 'f',
                   'h', 'g', 'u', 'r', 'y', 't'};

Dictionary<char, char> encrypt = new Dictionary<char, char>();
Dictionary<char, char> decrypt = new Dictionary<char, char>();

for (int i = 0; i < 26; i++)
{
    encrypt.Add(alphabet[i], mappings[i]);
    decrypt.Add(mappings[i], alphabet[i]);
}
char[]字母表={'a','b','c','d','e',
‘f’、‘g’、‘h’、‘i’、‘j’,
‘k’、‘l’、‘m’、‘n’、‘o’,
‘p’、‘q’、‘r’、‘s’、‘t’,
‘u’、‘v’、‘w’、‘x’、‘y’、‘z’};
char[]映射={'q','p','a','l','z',
‘x’、‘m’、‘s’、‘k’、‘w’,
‘o’、‘e’、‘i’、‘d’、‘j’,
‘c’、‘n’、‘v’、‘b’、‘f’,
‘h’、‘g’、‘u’、‘r’、‘y’、‘t’};
字典加密=新字典();
字典解密=新字典();
对于(int i=0;i<26;i++)
{
encrypt.Add(字母[i],映射[i]);
decrypt.Add(映射[i],字母[i]);
}

以下是简化工作的方法:

只需使用一个char[]进行加密,另一个用于解密。您可以通过字母的ascii值对其进行索引,因此可以使用更大的数组(256而不是26),但代码要简单得多

考虑一下这样的情况:

string mapping="bcdefghij...za"; // simple example to code 'a' as 'b'.

char[] encode = new char[256];
char[] decode = new char[256];

for (char a='a'; a<='z'; a++) {
  encode[a]=mapping[a-'a'];
  decode[ mapping[a-'a'] ] = a;
}
string encodeString(string plaintext) {
  return new string( plaintext.Select(c=>encode[c]).ToArray() );
}

您可能需要在其中添加一些类型转换(我没有尝试编译代码),但想法就在这里。

您的方法已经是最好的了。不过,请尝试将您的词典包装在一个类中,就像Jon Skeet在这里所做的那样:

您使用两个词典的方法很好,但我会将其包装成一个类。@keyboardP,谢谢!这很有帮助。