2016-03-23 4 views
1

Die erste if Anweisung in diesem Programm überprüft eine Zeichenfolge gegen einen Buchstaben Ich verwende den logischen Operator or (||), um den ersten Buchstaben mit der Zeichenfolge zu vergleichen. Es ist langwierig und für die Zukunft suche ich einen Weg, dies schneller und kürzer zu machen.Gibt es eine Möglichkeit, ein Zeichen anhand einer Liste von Zeichenfolgen zu prüfen, ohne eine lange Kette von ODER-Operatoren zu schreiben?

string strUser; 
string strSubCheck; 
Console.WriteLine("Please type in a word:"); 
strUser = Console.ReadLine(); 
strSubCheck = strUser.Substring(0, 1);  

if(strSubCheck == "A" || strSubCheck == "a" || strSubCheck == "E" || strSubCheck == "e" || strSubCheck == "I" || strSubCheck == "i" || strSubCheck == "O" || strSubCheck == "o" || strSubCheck == "U" || strSubCheck == "u") 
    { 
     Console.WriteLine("\nThe first letter is a vowel"); 
    } 
else Console.WriteLine("\nThe first letter is a consonant"); 
+0

Wenn Sie möchten, dass jemand Ihren Code überprüft; Gehe zu codereview.stackexchange.com; Wenn Sie möchten, dass Ihre Frage hier erneut geöffnet wird, benötigen wir einen Titel und eine Problembeschreibung, nach der andere Personen suchen würden, wenn sie Ihr Problem hätten. Niemand würde nach "gibt es einen einfacheren und kürzeren Weg, dies zu tun" suchen; Erzähl uns dein Problem. mit Wörtern, mit denen Sie suchen würden, um dieses Problem zu lösen. –

+0

^was er sagte. Auch bei der Code Review, weil * jede einzelne Frage * buchstäblich nach einer * kürzeren und saubereren Methode verlangt *, wird ein Titel benötigt, der potenziellen Rezensenten * sagt, was dein Code macht *. –

+3

@GeorgeStocker Ich glaube nicht, dass es eine gute Vorgehensweise war, diese Frage zu schließen. Die Frage ist spezifisch genug, um eine gute Antwort zu haben, abgesehen von ihrem Titel, der definitiv verbessert werden könnte (was ich getan habe). – dasblinkenlight

Antwort

9

Dies gibt Ihnen die gleiche Antwort wie Sie Ihren Code, und ist einfacher zu erweitern:

bool beginsWithVowel = "aAEeIiOoUu".Contains(strUser[0]); 

Oder mit Vermeidung von Groß- und Kleinschreibung haben (nicht garantiert für alle Kulturen zu arbeiten):

bool beginsWithVowel = "AEIOU".Contains(char.ToUpper(strUser[0])); 

(Und das strUser überprüfen ist dies nicht null, bevor Sie, natürlich ...)

Wenn Sie wollte, dass dies für alle Kulturen funktionieren würde, ohne die Groß- und Kleinschreibung der Vokale explizit anzugeben, könnten Sie string.IndexOf() wie von Nyerguds unten erwähnt verwenden. Allerdings, wenn Sie das tun, beginnt es wesentlich komplizierter zu bekommen und an diesem Punkt denke ich, ich würde lieber nur die Version verwenden, die die oberen und unteren Zeichen explizit angibt:

bool beginsWithVowel = "AEIOU".IndexOf(new string(strUser[0], 1), StringComparison.CurrentCultureIgnoreCase) >= 0; 

(Siehe What is the correct way to compare char ignoring case? für weitere Details Vergleich der Groß-/Kleinschreibung in Groß- und Kleinschreibung.)

+1

@Downvoter: Interessieren Sie sich, um zu erklären, was mit dieser Antwort falsch ist? –

+4

Ich habe nicht downvote, aber es gibt eine mögliche Ausnahme, wenn die Zeichenfolge leer ist. Darüber hinaus wäre es effizienter, nur eine Art von Zeichen beizubehalten und den Fall programmatisch zu konvertieren. –

+2

String.IndexOf hat eine IgnoreCase-Option, daher ist die Verwendung kompakter, da Sie sie nur in einem Fall benötigen. Sie müssen dann natürlich> = 0 überprüfen. – Nyerguds

1

Beachten Sie, dass kürzer nicht immer besser ist. Solange es klar lesbar ist, sollte die Priorität im Code liegen.

string strUser; 
string strSubCheck; 
Console.WriteLine("Please type in a word:"); 
strUser = Console.ReadLine(); 
strSubCheck = strUser.Substring(0, 1); 
var vowelCheck = new[] { "a", "e", "i", "o", "u" }; 

if (vowelCheck.Contains(strSubCheck.ToLower())) 
{ 
    Console.WriteLine("\nThe first letter is a vowel"); 
} 
else Console.WriteLine("\nThe first letter is a consonant"); 
Verwandte Themen