2017-05-03 3 views
2

Ich muss eine Reihe von Benutzereingaben in meiner Konsolenanwendung überprüfen, bevor ich meine Methode auslöst und Daten in meine Datenbank speichere.Sie müssen eine Gruppe von Benutzereingaben validieren, bevor Sie eine Methode auslösen. C#

Das Programm kompiliert und rundt ohne Ausnahmen. Aber bei einem falschen Input läuft es immer noch für die anderen drei durch.
Obwohl, was ich wirklich brauche, ist sicherzustellen, dass die 4 Benutzer Einträge korrekt sind, bevor die Methode ausgelöst wird und falls nur eine falsch ist, sollte das gesamte Programm stoppen und beenden.

using System; 
using System.Threading; 

namespace BarcodeValidation 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ReadBarcode(); 
     } 

     static void ReadBarcode() 
     { 
      var barcodes = GetInput(); 

      foreach (var item in barcodes) 
      { 
       // something 
       CheckUserInput(item); 
      } 
     } 

     static string[] GetInput() 
     { 
      Console.WriteLine("Please enter 4 products ID, Barcodes, MPN or EAN code:"); 

      string[] barcode = new string[4]; 

      for (int i = 0; i < barcode.Length; i++) 
      { 
       barcode[i] = Console.ReadLine(); 
      } 
      return barcode; 
     } // end of method here 

     static void CheckUserInput(string userInput) 
     { 
      int msec = 5000; 

      try 
      { 
       if (!(userInput == "F5121" || userInput == "F3111" || userInput == "F8331" || userInput == "F5321")) 
       { 
        Console.WriteLine("Enter a valid MPN codes for your products"); 
        Thread.Sleep(msec); 
        Environment.Exit(0); 
       } 
       else 
       { 
        switch (userInput) 
        { 
         case "F5121": 
          Console.WriteLine("barcode 1 is =", userInput); 
          Thread.Sleep(msec); 
          break; 
         case "F3111": 
          Console.WriteLine("barcode 2 is =", userInput); 
          Thread.Sleep(msec); 
          break; 
         case "F8331": 
          Console.WriteLine("barcode 3 is =", userInput); 
          Thread.Sleep(msec); 
          break; 
         case "F5321": 
          Console.WriteLine("barcode 4 is =", userInput); 
          break; 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 
}  
+0

Tun Sie das nicht? Überprüfen Sie für jeden Eintrag die Benutzereingabe. 'CheckUserInput' wird dann beendet, wenn die Eingabe falsch ist. Was in deinem aktuellen Programm funktioniert nicht? – Default

+0

'bool errorOccurred = false;' => Ersetzen Sie 'foreach' w /' while (errorOccurred == false) 'und setzen Sie' errorOccurred' auf 'true', wenn eine Eingabe ungültig ist? Check ist wieder nach Ihrem Blick, um zu sehen, ob fortfahren oder nicht. –

+0

Welchen Teil Ihres Programms möchten Sie "nicht ausführen"? weil es das Programm beenden würde, wenn mindestens 1 Ihrer Einträge falsch ist, haben Sie dieses Recht bereits. Es wird sofort beendet. Aber wenn alle 4 "CheckUserInput" übergeben, ist das das Ende Ihres Programms, das ist alles, was in "ReadBarcode" passiert ... Was möchten Sie nicht tun, wenn einer von ihnen falsch ist? – Skintkingle

Antwort

2

Da Sie eine Methode, die tatsächlich Ihre Benutzereingabe prüft verwendet es ist Rückgabewert:

static bool CheckUserInput(string userInput) // true : valid | false : invalid 
{ 
    int msec = 5000; 
    try 
    { 
     if (!(userInput == "F5121" || 
       userInput == "F3111" || 
       userInput == "F8331" || 
       userInput == "F5321")) 
     {  
      Console.WriteLine("Enter a valid MPN codes for your products"); 
      return false; 
     } 
     else 
     { 
      switch (userInput) 
      { 
       case "F5121": 
        Console.WriteLine("barcode 1 is =", userInput); 
        Thread.Sleep(msec); 
        return true;      
       case "F3111": 
        Console.WriteLine("barcode 2 is =", userInput); 
        Thread.Sleep(msec); 
        return true; 
       case "F8331": 
        Console.WriteLine("barcode 3 is =", userInput); 
        Thread.Sleep(msec); 
        return true; 
       case "F5321": 
        Console.WriteLine("barcode 4 is =", userInput); 
        return true; 
       default: 
        return false; 
      } 
     } 

    } 
    catch (Exception ex) 
    { 

     Console.WriteLine(ex.Message); 
     return false; 
    } 

} 

ReadBarcodes könnte wie folgt aussehen:

static void ReadBarcode() 
{ 
    var barcodes = GetInput(); 
    bool errorOccured = false; 
    foreach (var item in barcodes) 
    { 
     // something 
     if(!CheckUserInput(item)) 
     { 
      errorOccured = true; // keep track of that error 
      break; //Break for if 1 input is invalid 
     } 
    } 
    //Further execution.... 
    if(errorOccured) 
    { 
     return; //Do not continue ... 
    } 
    //Do other things you want to do. Your input is valid at this point ! 
} 

oder kürzer wie Standard zitiert:

static void ReadBarcode() 
{   
    if(!GetInput().All(CheckUserInput)) 
    { 
     return; 
    } 
    //Your stuff goes here. Input is valid at this point 
} 
+1

oder benutze LINQ: 'bool success = barcodes.Alle (CheckUserInput);' – Default

+0

@Default good point! Ich habe das zu meiner Antwort hinzugefügt –

+0

Kann auch nützlich sein, um den "Standard" -Wert in den Schalter aufzunehmen und den if-Prüfcode in den Standard zu verschieben, der impliziert wird, wenn er keinem der Fälle entspricht. – Skintkingle

0

Eine Option, die Sie verwenden können, ist Ihre eigene Klasse erstellen, die von System.Exception leitet, und in Fällen, in denen einer der Eingänge für ungültig befunden wird, könnte man eine Instanz der Exception-Klasse werfen.

Sie könnten Ihren Code in einen try-catch Block einpacken und dann den Sanierungscode in den catch Block einfügen.

0

Sie müssen den Checki brechen ng code und der "output" -Code an verschiedenen Stellen. Sie müssen überprüfen, ob alle Werte gültige Werte sind. und nachdem Sie alle Werte überprüft haben, dann machen Sie Ihre console.writelines (Was ist der Teil, den Sie nicht passieren wollen). Im Moment prüft es eins und führt den Code aus, wenn dieser gültig ist, und geht dann zum nächsten über. CheckUserInput sollte wirklich nur die Benutzereingabe überprüfen, es sollte nichts anderes tun, das Sie basierend auf diesem Methodenergebnis einschränken möchten. Sie sollten CheckUserInput und ExecuteBarcodeStuff zum Beispiel haben, und nur, wenn alle CheckUserInput s true zurück, sollten Sie die neue (noch nicht implementiert) laufen ExecuteBarcodeStuff

Mischen dieser Ansatz mit anderen Völkern Antworten, die LINQ-Abfragen zu tun oder so alles, um sicherzustellen, Die Ergebnisse waren positive Übereinstimmungen werden Ihnen das gewünschte Ergebnis bringen.

Verwandte Themen