c#将字符串中的所有字母切换为不同的预选字母

c#将字符串中的所有字母切换为不同的预选字母,c#,string,cryptography,C#,String,Cryptography,在做一个简单的项目时,我试图想出一个非常基本的密码系统,它允许我将消息中的字母切换到另一个预先选择的字母。到目前为止,我已经尝试了几种方法,但都没有成功。(*注意:这不是为了学习c#的基础知识,所以随机性和安全性在这种情况下并不重要,我只是想把一个字母转换成另一个字母,以便学习如何操作) 首先我定义了一些字符串,比如 string a = "a"; string b = "b"; string c = "d"; ..... //continues to string z = "z" 接下来,我

在做一个简单的项目时,我试图想出一个非常基本的密码系统,它允许我将消息中的字母切换到另一个预先选择的字母。到目前为止,我已经尝试了几种方法,但都没有成功。(*注意:这不是为了学习c#的基础知识,所以随机性和安全性在这种情况下并不重要,我只是想把一个字母转换成另一个字母,以便学习如何操作)

首先我定义了一些字符串,比如

string a = "a";
string b = "b";
string c = "d";
..... //continues to string z = "z"
接下来,我尝试根据输入到名为
PlainTextBox
的文本框中的值创建一个新字符串,并将它们放在名为
ChangedTextBox
的单独文本框中。此代码由按钮单击事件触发

string str = PlainTextBox.Text;
char[] array = str.ToCharArray();
array[int.Parse(a)] = 'x';
array[int.Parse(b)] = 'y';
array[int.Parse(c)] = 'z';
.......// continues to (z)
str = new string(array);
ChangedTextBox.Text = str;
但此代码引发异常,因为输入不是有效的整数。基本思想是,如果用户在
明文框
中键入“abc”并按下按钮,则
ChangedTextBox
应显示“xyz”,但应包含明文框中的整个文本,将消息中的每个字母切换到所选的对应字母

除了我收到的错误之外,这段代码似乎非常繁琐和低效

有没有更快的方法来实现这个结果

int.Parse(a)
当然会抛出InvalidCastException,因为a是您定义的字符串

string a = "a";
当然会抛出InvalidCastException,因为a是您定义的字符串

string a = "a";

为了完整起见,我还将包括一些信息,即您正在做的事情被称为

你可以给自己定义一本合适的
字典

var mapping = new Dictionary<char, char>()
{
    { 'a', 'x' },
    { 'b', 'y' },
    { 'c', 'z' }
    // other letters
}

为了完整起见,我还将包括一些信息,即您正在做的事情被称为

你可以给自己定义一本合适的
字典

var mapping = new Dictionary<char, char>()
{
    { 'a', 'x' },
    { 'b', 'y' },
    { 'c', 'z' }
    // other letters
}

您为映射选择了错误的集合类型(数组);字典要方便得多

private static Dictionary<char, char> m_Mapping = new Dictionary<char, char>() {
  {'a', 'x'}, // a -> x
  {'b', 'y'}, // b -> y
  ...  
};
但您的(修改后的)实施已经足够好了:

private static String Encode(string str) {
  char[] array = str.ToCharArray();  

  for (int i = 0; i < array.Length; ++i) {
    // Simplest: we don't check if the actual character can be mapped 
    array[i] = m_Mapping[array[i]];
  }

  return new string(array);
}
编辑:在一般情况下,当
m_映射
不包含某些字符的记录时(例如新行
\n
),因此我们希望保留这些字符的完整性,我们不能使用直接
m_映射[…]
,但应该实现,比如说,
EncodeChar

private static char EncodeChar(char value) {
  char result;

  if (m_Mapping.TryGetValue(value, out result))
    return result;
  else
    return value;  
} 
并将
EncodeChar(…)
替换为
m_映射[…]

private static String Encode(String value) {
  return String.Concat(value.Select(EncodeChar(c)));
}
你的版本

private static String Encode(string str) {
  char[] array = str.ToCharArray();  

  for (int i = 0; i < array.Length; ++i) {
    array[i] = EncodeChar(array[i]);

  return new string(array);
}
私有静态字符串编码(字符串str){
char[]数组=str.ToCharArray();
for(int i=0;i
您为映射选择了错误的集合类型(数组);字典更方便

private static Dictionary<char, char> m_Mapping = new Dictionary<char, char>() {
  {'a', 'x'}, // a -> x
  {'b', 'y'}, // b -> y
  ...  
};
但您的(修改后的)实施已经足够好了:

private static String Encode(string str) {
  char[] array = str.ToCharArray();  

  for (int i = 0; i < array.Length; ++i) {
    // Simplest: we don't check if the actual character can be mapped 
    array[i] = m_Mapping[array[i]];
  }

  return new string(array);
}
编辑:在一般情况下,当
m_映射
不包含某些字符的记录时(例如新行
\n
),因此我们希望保留这些字符的完整性,我们不能使用直接
m_映射[…]
,但应该实现,比如说,
EncodeChar

private static char EncodeChar(char value) {
  char result;

  if (m_Mapping.TryGetValue(value, out result))
    return result;
  else
    return value;  
} 
并将
EncodeChar(…)
替换为
m_映射[…]

private static String Encode(String value) {
  return String.Concat(value.Select(EncodeChar(c)));
}
你的版本

private static String Encode(string str) {
  char[] array = str.ToCharArray();  

  for (int i = 0; i < array.Length; ++i) {
    array[i] = EncodeChar(array[i]);

  return new string(array);
}
私有静态字符串编码(字符串str){
char[]数组=str.ToCharArray();
for(int i=0;i
正如其他答案所说,最好的解决方案可能是使用字典。但是,如果我理解您的要求,您只需将一个字母按该字母加上一个“循环”方式的偏移量进行更改。此解决方案将执行类似操作(输入“abcd”时,它将返回“xyza”):


使用此解决方案,您可以轻松更改偏移量(更改
startChar
)。它还有改进的余地,例如,它只适用于a-z中较低的字母,可以更改为更广泛。

可能最好的解决方案是使用字典,正如其他答案所说。但如果我理解您的要求,您只需按该字母加上某种“循环”中的偏移量来更改一个字母即可方法。此解决方案将执行类似操作(以“abcd”作为输入,它将返回“xyza”):


使用此解决方案,您可以轻松更改偏移量(更改
startChar
)。它还有改进的余地,例如,它只适用于a-z的小写字母,可以更改为更广泛。

这不是问题的答案是的,我注意到这是错误的原因,因为它是一个字符串,而不是我定义的整数,如果我的措辞不清楚,我很抱歉。我只包含了这段代码因为我必须在我的问题中提供以前尝试过的示例代码,以显示我尝试过的内容。我的问题是,实现这一点的正确和最有效的方法是什么。这不是问题的答案。是的,我注意到这是错误的原因,因为它是一个字符串,而不是我定义的整数,对不起如果我的措辞不清楚。我之所以包含此代码,是因为我必须在问题中提供以前尝试的示例代码,以显示我尝试了什么。我的问题是,实现这一点的正确和最有效的方法是什么。使用字符而不是字符串
(int)“a”
是97,b是98等等,从那里偏移。你到底想做什么?因为“a”是一个字符串,你不能将它转换(或解析)为int。如果输入字符串是“abcd”,输出会是“xyza”吗?使用字符而不是字符串
(int)'a'
是97,b是98等等,从那里偏移。你到底想做什么?作为“a”是字符串,您无法将其转换(或解析)为int。如果输入字符串为“abcd”,则输出是否为“xyza”?我至少要注意,代码应该具有必要的错误处理,以处理字符串中没有映射的字符。如图所示的解决方案将抛出一个
KeyNotFou