2015-01-13 7 views
6

ich den Code in Schalterblock umkehren will eher es mich selbst zu tun (es scheint keinen Sinn für mich zu machen) ab:Reverse-Schalter case-Anweisung

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

Wie macht es so zu handeln, umgekehrt :

    case '1': 
         s += 'a';break; 
        case '2': 
         s += 'q'; break; 

Mein Code enthält mehr als 30 Anweisungen für jedes Zeichen.

+4

1. Erstellen Sie ein 'Dictionary'. 2. ??????? 3. PROFIT !!!! – zerkms

+1

Das ist gut, weil Sie erkannt haben, dass es einen besseren Weg geben muss. –

+2

es mit einem Schalter an erster Stelle zu tun war falsch. Sie sollen ein Paar von char-Arrays, die von einem zum anderen – pm100

Antwort

2

Erstellen Sie eine Dictionary<char, char> für das Mapping (tatsächlich könnten Sie zwei aus Leistungsgründen und Benutzerfreundlichkeit erstellen), oder einen einfachen Listentyp mit einem benutzerdefinierten Objekt (wie List<Tuple<char, char>>). Sie können eine Methode erstellen, um das Hinzufügen zu vereinfachen. Beachten Sie, dass key und val eindeutig sein müssen!

private void Add(char key, char val, Dictionary<char, char> dictionary, Dictionary<char, char> reverseDictionary) 
{ 
    dictionary.Add(key, val); 
    reverseDictionary.Add(val, key); 
} 

Dann verwenden:

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 
} 

Und für die Rückseite:

char outputChar; 
if (reverseDictionary.TryGetValue(inputChar, out outputChar)) 
{ 
    // use outputChar 
} 
+0

Karte oops, ich bin Anfänger noch und dass Code scheint mich zu sein, nicht vertraut, aber dank sehr viel, es sieht immer noch wie sehr einfach als Duplizierung switch-Anweisung! –

+0

Was ist unklar? Ich denke, Lambda-Ausdrücke sind eine Brücke zu weit für Sie;) –

+0

Wenn Lambada das klar und einfach, kann ich es jetzt lernen –

1

Sie wollen etwas wie folgt aus:

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 Typing wirdzurückkehren. Sie können es auch umkehren:

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

So jetzt können Sie nach Wert suchen und Schlüssel erhalten. Wenn Sie aq eingeben, wird 12 zurückgegeben.

0

Eine Option besteht darin, ein Wörterbuch zu erstellen, das die Zuordnung enthält, und anschließend die Zuordnung durchzuarbeiten, die die Ausgabezeichenfolge aufbaut, wenn das aktuelle Zeichen im Zuordnungswörterverzeichnis vorhanden ist.

Die folgende Lösung zeigt die Verwendung eines Wörterbuchs mit Strings, die Groß-/Kleinschreibung und Kultur ignorieren, so dass Sie nicht mehrere Einträge für Groß- und Kleinschreibung benötigen (dies ist natürlich ein optionales Design).

Ich zeige auch die Verwendung von StringBuilder, die beim Anhängen von Strings viel effizienter ist.

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