我做了一些常量字符串:
public const string a_sub = "S";
public const string b_sub = "Y";
public const string c_sub = "X";
public const string d_sub = "W";
// ...
我有一个文字:
string str = "This is a test";
我想做类似的事情:
foreach(char c in str)
{
str.Replace(c,c_sub);
让我们假装c是a,那么它将是:
str.Replace(c, a_sub);
如果c为d,那么它将是:
str.Replace(c, d_sub);
等等
}
但我无法找到办法,有些帮助..请?
答案 0 :(得分:2)
使用Dictionary和Stringbuilder:
Dictionary<char, char> mapper = new Dictionary<char, char>
{
{'a','S'},
{'b','D'},
.......
};
var str = "aaaaaaaabbbbbbbb";
var sb = new StringBuilder(str);
for (int i = 0; i < sb.Length; i++)
{
sb[i] = mapper[sb[i]];
}
var newStr = sb.ToString(); // SSSSSSSSDDDDDDDD
答案 1 :(得分:2)
在字典中定义你的const
private static Dictionary<string, string> dict = new Dictionary<string, string>
{
{"a", "S"},
{"b", "Y"},
{"c", "X"},
...
};
然后通过这个词典进行迭代
var str = "This is a test";
foreach (var c in dict)
{
str = str.Replace(c.Key, c.Value);
}
答案 2 :(得分:1)
另一种方法。
通过使用反射和StringBuilder获取临时结果(这将有助于避免错误/重复替换)
string str = "This is a test";
StringBuilder result = new StringBuilder();
for(int idx = 0; idx < str.Length; idx++)
{
char newChar = str[idx];
if (newChar != ' ')
{
string propName = string.Format("{0}_sub", newChar.ToString().ToLowerInvariant());
// program is the name of your class...
var field = typeof(Program).GetField(propName);
if(field != null)
{
// where null in case of static class
//replace with the name of the class where the consts are
newChar = field.GetValue(null).ToString().ToCharArray()[0];
}
}
result.Append(newChar);
}
str = result.ToString();
我觉得这个解决方案对初学者来说有点复杂,但更容易维持常量的变化。 一个弱点......由于变量命名约定,它不会涵盖所有可能的字符。
修改强>
感谢@Hopeless,感谢评论提高答案,避免不必要的虚拟课程
答案 3 :(得分:0)
在C#中,字符串是不可变的。要更改字符串的内容,您需要创建一个新字符串。
在您的情况下,您似乎正在用a_sub
替换所有字符串的字符,因此您只需重复 n 次的a_sub
字符, n 是原始字符串的长度:
string str = "This is a test";
const char a_sub = 'S';
str = new string(a_sub, str.Length);
修改:如果a_sub
需要是字符串(不是字符),您可以使用:
string str = "This is a test";
const string a_sub = "S";
str = string.Concat(Enumerable.Repeat(a_sub, str.Length));
答案 4 :(得分:0)
Dictionary<char, char> GetChar = new Dictionary<char, char>()
{
{'a','S'},
{'b','Y'}
};
string str = "This is a test";
string newStr = "";
for (int i = 0; i < str.Length; i++)
{
newStr = newStr + GetChar[str[i]];
}
我想这就是你想要的。使用字典是更好的主意,newStr将返回你想要的东西。
答案 5 :(得分:0)
看起来你想要像ROT13那样表现出一种奇怪,但是有一个非有序的字典(正如我所说的那样,因为你的翻译不按字母顺序排列)。
由于C#似乎缺少像Python这样的翻译函数
# ... Map a to d, b to e, and c to f.
dict = str.maketrans("abc", "def")
print(dict)
# Translate this value.
value = "aabbcc"
result = value.translate(dict)
print(result)
#Output: ddeeff
您必须使用字典而不是常量手动实现地图。
小心将翻译写入新变量而不是替换旧变量,因为您使用了一组无序键,因此可以在以后替换已经翻译过的字符(在你的例子首先用&#34; s&#34;以及&#34; s&#34;&#34; h&#34;)替换&#34; a&#34;&#34;&#34;)。
using System;
using System.Text;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
var d = new Dictionary<char, char>
{
{'a', 'S'},
{'b', 'Y'},
{'c', 'X'},
{'d', 'W'},
{'e', 'V'},
{'f', 'U'},
{'g', 'T'},
{'h', 'S'},
{'i', 'R'},
{'j', 'Q'},
{'k', 'P'},
{'l', 'O'},
{'m', 'n'},
{'n', 'M'},
{'o', 'L'},
{'p', 'K'},
{'q', 'J'},
{'r', 'I'},
{'s', 'H'},
{'t', 'G'},
{'u', 'F'},
{'v', 'E'},
{'w', 'D'},
{'x', 'C'},
{'Y', 'B'},
{'z', 'A'}
};
var input = "This is a test";
var result = new StringBuilder("");
foreach (var c in input.ToLower())
{
if (d.ContainsKey(c))
{
result.Append(d[c]);
}
else
{
result.Append(c);
}
}
Console.WriteLine(result.ToString());
}
}