2015-01-13 2 views
6

Я хочу обратить код внутри блока переключения, а делать это мой сам (это, кажется, не имеет смысла для меня) например:Реверс сазе

{   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 инструкций для каждого символа.

+4

1. Создайте «Словарь». 2. ??????? 3. ПРИБЫЛЬ !!!! 11 – zerkms

+1

Это хорошо, потому что вы поняли, что должен быть лучший способ. –

+2

делать это с помощью переключателя на первом месте было неправильно. У вас должна быть пара массивов char, которые сопоставляются друг с другом – pm100

ответ

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 
} 
+0

oops, я все еще новичок, и этот код мне кажется незнаком, , но спасибо большое, он по-прежнему выглядит очень просто, чем дублирование оператора switch! –

+0

Что неясно? Я думаю, что лямбда-выражения - это слишком большой мост для вас;) –

+0

Если ямбада ясна и понятна, я могу это узнать сейчас –

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

Typing 12 вернется aq. Вы также можете изменить его:

string s = name.Where(dictionary.ContainsValue) 
       .Aggregate("", (current, t) => current + dictionary.FirstOrDefault(z => z.Value == t).Key); 

Итак, теперь вы можете искать по стоимости и получить ключ. Итак, набрав aq, вы вернетесь 12.

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