反转 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>>)。您可以制定一种方法来简化添加。注意 keyval 必须是唯一的!

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);
        }
    }
}