2016-12-12 1 views
2

Ich versuche, einen Kunden in der Datei zu speichern, aber wenn ich es speichere, hält es die Person in Schleife, die ich eintrug, weiß ich nicht, wo ich es falsch mache. Das Problem ist, ich denke meine Logik ist gut aber ich weiß, dass ich irgendwo etwas falsch mache, das ich es nicht finden kann. Wenn Sie mir helfen konnten, schätze ich es wirklich.Wie zu stoppen, Datei in C# loopen?

public partial class admin : Window 
{ 
    accounts acclist = new accounts(); 
    customers cuslist = new customers(); 

    public admin(string pin, accounts myacc, customers mycus) 
    { 
     InitializeComponent(); 
     acclist = myacc; 
     cuslist = mycus; 
    } 

    public void saveaccount() 
    { 
     using (StreamWriter writer = new StreamWriter("account.txt")) 
     { 
      for (int i = 0; i < acclist.Count; i++) 
      { 
       var info = new List<string> 
       { 
        acclist[i].accounttype.ToString(), 
        acclist[i].PIN, 
        acclist[i].accountnumber, 
        acclist[i].accountbalance.ToString() 
       }; 
       var account = String.Join(";", info); 
       writer.WriteLine(account); 
      } 
     } 
    } 


    //save to customer file 
    public void savefile() 
    { 
     using (StreamWriter writer = new StreamWriter("customer.txt")) 
     { 
      for (int i = 0; i < cuslist.Count; i++) 
      { 
       var info = new List<string> 
       { 
        cuslist[i].NAME.ToString(), 
        cuslist[i].pin, 

       }; 
       var customer = String.Join(";", info); 
       writer.WriteLine(customer); 
      } 
     } 
    } 

    // add user 
    private void Sub_Click(object sender, RoutedEventArgs e) 
    { 
     customer newCus = new customer(); 
     account newAcc= new account(); 
     try 
     { 
      newCus.NAME = Nameadd.Text; 
      newCus.pin = pinadd.Text; 

      newAcc.PIN = pinadd.Text; 
      newAcc.accountnumber = Accountnumadd.Text; 
      newAcc.accounttype = 'C'; 
      for (int i = 0; i < acclist.Count; i++) 
      { 
       { 
        if(newAcc.accounttype == 'C') 
        { 
         newAcc.PIN = pinadd.Text; 
         newAcc.accountnumber = Accountnumadd.Text; 
         newAcc.accounttype = 'S'; 
        } 
       } 
       cuslist.add(newCus); 
       acclist.add(newAcc); 
       savefile(); 
       saveaccount(); 
      } 
     } 
     catch(Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 
} 
+0

ja bro sein nicht, dass –

Antwort

0

Betrachten Sie die Verwendung einer foreach Schleife. Diese Schleife wird am besten für Anwendungen wie die in Ihrer savefile() Methode verwendet. Es ist ideal für Anwendungen, bei denen Sie eine Aktion für jedes Element in einer Liste oder Sammlung ausführen möchten.

Siehe hier: https://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx?f=255&MSPPError=-2147217396

EDIT: Das gewählte Beispiel:

 List<string> FruitBasket = new List<string>(); 
     FruitBasket.Add("apple"); 
     FruitBasket.Add("banana"); 
     FruitBasket.Add("orange"); 
     foreach (string fruit in FruitBasket) 
     { 
      Console.WriteLine(fruit); 
     } 

und dies führt zu einer Leistung von: apple, banana, orange.

In der foreach-Schleife Sie benötigen eine Variable vom gleichen Typ wie Ihre Sammlung zu erklären (so in diesem Beispiel hatte ich eine Liste von Strings, so habe ich meine Variable eine Zeichenfolge und dann keyword sie in diese Variable auf jedem ordnet -

+0

ich wirklich nicht wissen, wie foreach Schleife verwenden können Sie mir ein bisschen damit helfen plz –

+0

@MassodAli Sicher werde ich ein Beispiel posten und es erklären, aber Sie sollten das Beispiel an der Unterseite überprüfen der Link, den ich geteilt habe. Es wird immer genauer und hilfreicher sein als alles, was ich jemals produzieren kann. Aber ich hoffe mein Beispiel macht Sinn. * siehe meine Bearbeitung in meiner Antwort –

0

In Ihrem "save" -Event führen Sie eine for-Schleife über die "Anzahl" von Elementen in Ihrer Account-Liste aus. Diese account list-Variable ist global in Bereich zu Ihrer Klasse. Das Problem ist, dass Sie in Ihrer Schleife diese Liste hinzufügen ... also wirklich die Liste, die Sie durchlaufen, mutiert direkt unter Ihnen. Wenn Sie diesen Kunden hinzufügen, startet die Schleife als nächstes Iteration, prüft die "Zählung" und endet nur, wenn "i" im Wert gleich der Zählung ist. Jedoch jeden Durchlauf du fügst der Zählung hinzu ... also technisch wirst du niemals das Ende erreichen, da der accList.Count ständig um 1 erhöht wird.

Ich schlage vor, für eine, verwenden Sie eine ForEach-Anweisung, wie es vorgeschlagen wurde. Verwenden Sie auch eine separate Liste, um Ihre "neuen" Konten zu halten. Wenn Sie aus irgendeinem Grund zu aklist hinzufügen müssen, dann iterieren Sie, nachdem Sie Ihre neue Liste hinzugefügt haben, und fügen Sie jede davon zu Ihrer acklist hinzu. Auf diese Weise verhindern Sie, dass Sie genau das Objekt mutieren, das Sie durchlaufen.

Eine andere Möglichkeit besteht darin, den "count" zuerst in eine Variable zu speichern und zu überprüfen, damit sich diese niemals ändert.

var myCounter = acclist.Count 
for (int i = 0; i < myCounter ; i++) 
     { 
... 

Aber ich weiß nicht, welche Option am besten für Dich ist, wie ich offensichtlich nicht wissen, den größeren Kontext, was Sie brauchen, um letztlich zu tun. :) Beide Lösungen sollten jedoch Ihre Endlosschleife stoppen.

+0

Vielen Dank für Ihre Zeit zu nehmen, um meine Frage zu beantworten .wo sollte ich foreach hinzufügen –

+0

mit einem "foreach" über ein "für" gewonnen 'unbedingt beheben Sie Ihr Problem ... aber es könnte dazu führen Leistungsverbesserungen. Einige Entwickler betrachten es als einfacher zu lesen ... andere nicht. Also liegt es an dir. Wenn Sie eine Foreach verwenden möchten, ersetzen Sie Ihre "for" -Schleife durch die "foreach" -Syntax. Siehe diesen Artikel: https://www.dotnetperls.com/for-foreach – dvsoukup

Verwandte Themen