如何在c#中停止循环文件?

时间:2016-12-12 20:05:15

标签: c#

我试图将客户保存在文件中但是当我保存它时,它会循环我输入的人我不知道我在哪里做错了。问题是我和#39;我认为我的逻辑是好的,但我知道我在某个地方做错了,我找不到它。如果你能帮助我,我真的很感激。

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

2 个答案:

答案 0 :(得分:0)

考虑使用foreach循环。此循环最适用于savefile()方法中的应用程序。它非常适合您希望对列表或集合中的每个项目执行操作的应用程序。

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

编辑:请求的示例:

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

这导致输出: applebananaorange

在foreach循环中,你需要声明一个与你的集合相同类型的变量(所以在这个例子中我有一个字符串列表,所以我把我的变量变成了一个字符串,然后他们关键字in指定了这个变量到该集合中的每个项目,从头开始一次一个。

答案 1 :(得分:0)

在你的&#34;保存&#34;事件,你在&#34;计数&#34;您帐户列表中的元素。该帐户列表变量在您的类的范围内是全局的。问题是,在你的循环中,你要添加到该列表中...所以你正在迭代的列表实际上是在你下面进行变异。当您添加该客户时,循环开始下一次迭代,检查&#34; count&#34;并且仅在&#34; i&#34;值与计数值相等。但是每次通过你都会加入计数......所以从技术上来说,你永远不会到达终点,因为每次通过accList.Count都会不断增加1。

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++) // here you are checking acclist.Count... each iteration this increases by 1, thus i will never technically ever be equivalent to acclist.Count
        {
            {
                if(newAcc.accounttype == 'C')
                {
                    newAcc.PIN = pinadd.Text;
                    newAcc.accountnumber = Accountnumadd.Text;
                    newAcc.accounttype = 'S';
                }
            }
            cuslist.add(newCus);
            acclist.add(newAcc); // <-- this is where you're adding to acclist each time.  However inside this loop you're constantly increasing its size... thus your infinite loop you're hitting.
            savefile();
            saveaccount();
        }
        }
        catch(Exception error)
        {
            MessageBox.Show(error.Message);
        }
    }

我建议您使用ForEach语句,因为它已被建议。此外,使用单独的列表来保存您的&#34; new&#34;账户。如果您因任何原因需要添加到acclist,那么在您添加到新列表之后,迭代并将其中的每一个添加回您的acclist。这样你就可以避免改变你正在循环的对象。

另一种方法是先存储&#34;计数&#34;变成一个变量并检查它,所以它永远不会改变。

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

但是,我不知道哪种方案最适合你,因为我显然不知道你最终需要做什么的更大背景。 :)这两种解决方案都应该阻止你的无限循环。