我试图将客户保存在文件中但是当我保存它时,它会循环我输入的人我不知道我在哪里做错了。问题是我和#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);
}
}
}
答案 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);
}
这导致输出:
apple
,banana
,orange
。
在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++)
{
...
但是,我不知道哪种方案最适合你,因为我显然不知道你最终需要做什么的更大背景。 :)这两种解决方案都应该阻止你的无限循环。