2016-03-25 22 views
0

Ich brauche Hilfe mit einem C# -Programm, das ich erstelle. In diesem Szenario gebe ich doppelte Werte in das Programm ein. Zum Beispiel a, b, b, c, c.
Die Übung ist, dass wenn doppelte Buchstaben eingegeben werden (keine Zahlen), sollte ich einen Fehler erhalten, der besagt "Duplicate Value. Bitte versuchen Sie es erneut!" und akzeptiert den doppelten Wert nicht und sollte die Werte als a, b, c, d, e anzeigen.Müssen doppelte Werte aus C# -Programm entfernen

class Program 
{ 
    static void Main(string[] args) 
    { 
    char[] arr = new char[5]; 

    //User input 
    Console.WriteLine("Please Enter 5 Letters only: "); 

    for (int i = 0; i < arr.Length; i++) 
    { 
     arr[i] = Convert.ToChar(Console.ReadLine()); 
    } 
    //display 
    for(int i = 0; i<arr.Length; i++) 
    { 
     Console.WriteLine("You have entered the following inputs: "); 
     Console.WriteLine(arrArray[i]); 
    } 
} 
} 
+0

- Scannen Sie Ihr Zielarray und suchen Sie nach einer Übereinstimmung. Nur wenn Sie keine Übereinstimmung finden, fügen Sie den Artikel – TheEdge

+0

hinzu. Ich stimme dem Typen zu, der vorschlägt, dass Sie nur ein HashSet verwenden, aber eine andere Option ist Enumerable.Distinct. – Casey

+0

Mögliches Duplikat von [Frage nach Benutzereingabe mit Buchstaben (az) nur ohne Sonderzeichen oder Zahlen in C#] (http://stackoverflow.com/questions/36191717/how-to-ask-for-user-input- with-letters-az-only-ohne-spezielle-Zeichen-oder) –

Antwort

0

Verwenden Sie Any linq Ausdruck, um Duplikate zu überprüfen. char.TryParse validiert Eingabe und gibt true zurück, wenn erfolgreich.

public static void Main() 
{ 
    char[] arr = new char[5]; 

    //User input 
    Console.WriteLine("Please Enter 5 Letters only: "); 

    for (int i = 0; i < arr.Length; i++) 
    { 
     char input; 

     if(char.TryParse(Console.ReadLine(), out input) && !arr.Any(c=>c == input)) 
     {   

      arr[i] = input; 
     } 
     else 
     { 
      Console.WriteLine("Error : Either invalid input or a duplicate entry."); 
      i--; 
     } 
    } 

    Console.WriteLine("You have entered the following inputs: "); 
    //display 
    for(int i = 0; i<arr.Length; i++) 
    { 

     Console.WriteLine(arr[i]); 
    } 

} 

Arbeiten Code

0

Mit Hilfe eines Hash-Tabelle (Generic Dictionary) ist ein effizienter Weg, um zu bestimmen, ob eine eingegebene Zeichen bereits aufgetreten.

Auch die Char.IsLetter-Methode im .NET-Framework ist eine gute Möglichkeit, nach fehlerhaften Daten zu suchen.

static void Main(string[] args) { 
    Dictionary<char, bool> charsEntered = new Dictionary<char, bool>(); 

    Console.WriteLine("Please enter 5 characters, each on a separate line."); 
    while (charsEntered.Count() < 5) { 
     Console.WriteLine("Enter a character:"); 
     char[] resultChars = Console.ReadLine().ToCharArray(); 

     if(resultChars.Length != 1 || !Char.IsLetter(resultChars[0])) { 
      Console.WriteLine("Bad Entry. Try again."); 
     } else { 
      char charEntered = resultChars[0]; 
      if (charsEntered.ContainsKey(charEntered)) 
       Console.WriteLine("Character already encountered. Try again."); 
      else 
       charsEntered[charEntered] = true; 
     } 
    } 

    Console.WriteLine("The following inputs were entered:"); 
    Console.WriteLine(String.Join(", ", charsEntered.Keys)); 
    Console.ReadLine(); 
} 
+1

1) C# hat ein Hashset - Sie brauchen kein Wörterbuch zu verwenden 2) Es ist nicht "effizient" für 5 Zeichen, ist es wahrscheinlich langsamer als eine 'List' –

+1

Wenn wir über 5 Zeichen sprechen, ist die verwendete Datenstruktur irrelevant.Ich hätte in meinem Punkt klarer sein sollen, dass bei der Bestimmung, ob ein Duplikat in einer Datenstruktur enthalten ist, ein Dictionary unabhängig von der Anzahl der Elemente eine Suche nach einer konstanten Zeit ist, während eine Liste O (n) ist und immer langsamer wird mit jedem hinzugefügten Element. – AirmanAJK

1

richtige Datenstruktur zu Beginn wählen, verwenden HashSet statt Array, da die Operationen werden hauptsächlich & Einfügen aufzublicken.

+0

Damit können Sie einfach überprüfen, ob die Anzahl fünf war. – Casey

0

auf Antwort der Shelvin Ausarbeiten von HashSet mit

HashSet<char> chars = new HashSet<char>(); 

//User input 
Console.WriteLine("Please Enter 5 Letters only: "); 
for (int i = 0; i < 5;) 
{ 
    char c = Convert.ToChar(Console.ReadLine()); 
    if(!("abcdefghijklmnopqrstuvwxyz".Contains(c.ToString().ToLower()))) 
    { 
      Console.WriteLine("Please enter an alphabet"); 
      continue; 
    } 
    else if (!chars.Contains(c)) 
    { 
      chars.Add(c); 
      i++; 
    } 
    else 
    { 
      Console.WriteLine("Duplicate value please try again"); 
      continue; 
    } 
} 
//display 
Console.WriteLine("You have entered the following inputs: "); 
foreach(char c in chars) 
    Console.WriteLine(c.ToString()); 

Console.Read(); 
+0

Dies garantiert nicht die Reihenfolge der Eingabe (die gewährte Frage hat nicht wirklich gesagt, ob das wichtig war oder nicht). –

0

Keep it simple, und obwohl ein HashSet schön semantisch ist, ist es nicht für 5 Elemente benötigt (es ist tatsächlich langsamer als ein List in diesem Fall). Schlimmer noch, es erfordert eine parallele Struktur, um die Zeichen zu verfolgen (vorausgesetzt, Sie kümmern sich um die Reihenfolge).

eindeutig keine dieser Überlegungen wichtig für so ein kleines Beispiel, aber es ist gut, sie Front zu lernen und nicht springt immer Big-O-Notation, wenn tatsächlich die Leistung und Speicherverbrauch gemessen sollte Ihr Führer für die meisten praktisch Anwendungen.

Stattdessen können Sie einfach tun: -

List<char> chars = new List<char>(5); 
while (chars.Count < 5) 
{ 
    char c = Console.ReadKey().KeyChar; 
    if (!char.IsLetter(c)) continue; 
    if (chars.Contains(char)) continue; 
    chars.Add(char); 
} 

plus unabhängig von Fehlermeldungen Sie hinzufügen möchten.

Verwandte Themen