反转 switch case 语句
Reverse switch case statement
我想反转 switch 块中的代码而不是自己动手(这对我来说似乎没有意义)
例如:
{ 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 多个语句。
为映射创建一个 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
}
你想要这样的东西:
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
将 return aq
。您也可以反转它:
string s = name.Where(dictionary.ContainsValue)
.Aggregate("", (current, t) => current + dictionary.FirstOrDefault(z => z.Value == t).Key);
所以现在您可以按值查找并获取密钥。所以键入 aq
将 return 12
.
一个选项是创建一个字典来保存映射,然后如果映射字典中存在当前字符,则循环遍历构建输出字符串的映射。
下面的解决方案显示了使用忽略大小写和区域性的字符串字典,这样您就不必为大写和小写设置多个条目(这显然是一个可选设计)。
我还展示了 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);
}
}
}
我想反转 switch 块中的代码而不是自己动手(这对我来说似乎没有意义) 例如:
{ 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 多个语句。
为映射创建一个 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
}
你想要这样的东西:
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
将 return aq
。您也可以反转它:
string s = name.Where(dictionary.ContainsValue)
.Aggregate("", (current, t) => current + dictionary.FirstOrDefault(z => z.Value == t).Key);
所以现在您可以按值查找并获取密钥。所以键入 aq
将 return 12
.
一个选项是创建一个字典来保存映射,然后如果映射字典中存在当前字符,则循环遍历构建输出字符串的映射。
下面的解决方案显示了使用忽略大小写和区域性的字符串字典,这样您就不必为大写和小写设置多个条目(这显然是一个可选设计)。
我还展示了 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);
}
}
}