我想反转开关块内部的代码,而不是自己动手(这对我来说似乎毫无意义) 例如:
{ string name = Console.ReadLine();
string s = null;
for (int i = 0; i < name.Length; i++)
{
switch (name[i])
{
case 'a':
s += '1';break;
case 'q':
s += '2'; break;
}
}
}
如何将其反转为这样:
case '1':
s += 'a';break;
case '2':
s += 'q'; break;
我的代码包含每个字符超过30个语句。
答案 0 :(得分:2)
为映射创建Dictionary<char, char>
(事实上,出于性能原因和易用性,您可以创建两个),或者使用自定义对象(如List<Tuple<char, char>>
)创建简单列表类型。您可以制作一种方法,使添加更容易。请注意,key
和val
必须是唯一的!
private void Add(char key, char val, Dictionary<char, char> dictionary, Dictionary<char, char> reverseDictionary)
{
dictionary.Add(key, val);
reverseDictionary.Add(val, key);
}
然后使用:
Dictionary<char, char> dictionary = new Dictionary<char, char>();
Dictionary<char, char> reverseDictionary = new Dictionary<char, char>();
this.Add('a', '1', dictionary, reverseDictionary);
...
char outputChar;
if (dictionary.TryGetValue(inputChar, out outputChar))
{
// use outputChar
}
反过来说:
char outputChar;
if (reverseDictionary.TryGetValue(inputChar, out outputChar))
{
// use outputChar
}
答案 1 :(得分:1)
你想要这样的东西:
var dictionary = new Dictionary<char, char> {{'1', 'a'}, {'2', 'q'} /* ... */ };
string name = Console.ReadLine();
string s = name.Where(dictionary.ContainsKey)
.Aggregate("", (current, t) => current + dictionary[t]);
Console.WriteLine(s);
键入12
将返回aq
。你也可以改变它:
string s = name.Where(dictionary.ContainsValue)
.Aggregate("", (current, t) => current + dictionary.FirstOrDefault(z => z.Value == t).Key);
所以现在你可以按价值查找并获得密钥。因此,输入aq
将返回12
。
答案 2 :(得分:0)
一个选项是创建一个字典来保存映射,然后在映射字典中存在当前字符的情况下循环构建输出字符串的映射。
下面的解决方案显示使用忽略大小写和文化的字符串字典,这样您就不必为大小写分配多个条目(这显然是一个可选设计)。
我还展示了StringBuilder的使用,它在追加字符串时效率更高。
var MappingDictionary = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
MappingDictionary.Add("1", "a");
MappingDictionary.Add("2", "q");
var name = Console.ReadLine();
if (!string.IsNullOrEmpty(name))
{
var s = new StringBuilder(500);
foreach (var sourceChar in name)
{
string mappedTo;
if (MappingDictionary.TryGetValue(sourceChar.ToString(), out mappedTo))
{
s.Append(mappedTo);
}
}
}