C#如何从List集合中获取单个元素完成客户登录验证?
解决方案
原代码核心问题
- 循环逻辑错误:匹配到用户名后执行
continue直接跳过PIN校验,永远不会触发正确的登录逻辑 - 无终止遍历机制:即使找到匹配的账户也会继续遍历所有账户,错误提示会被后续不匹配的账户覆盖
- 空值校验无阻断:空输入弹提示后仍会继续执行登录校验逻辑
实现方案
使用LINQ的FirstOrDefault方法直接查询匹配用户名的唯一账户,无需手动遍历整个集合,找到对应账户后再单独校验PIN即可,代码修改如下:
private void btnLogin_Click_1(object sender, EventArgs e) { // 空值校验,不符合要求直接返回阻断后续逻辑 if (string.IsNullOrWhiteSpace(txtUsername.Text) || string.IsNullOrWhiteSpace(txtPassword.Text)) { MessageBox.Show("Please ensure to fill in all fields"); lblUsername.Text = string.Empty; lblPassword.Text = string.Empty; return; } var accounts = ProcessCSV("Accounts.csv"); // 直接查询匹配用户名的第一个账户,无匹配则返回null var matchedAccount = accounts.FirstOrDefault(account => account.CustomerName == txtUsername.Text); if (matchedAccount == null) { lblUsername.Text = "Incorrect Username"; lblPassword.Text = string.Empty; return; } // 仅对匹配到的单个账户做PIN校验 if (matchedAccount.PIN == txtPassword.Text) { // 登录成功,建议将当前账户传入主界面,方便后续交易操作 Form1 f1 = new Form1(matchedAccount); f1.ShowDialog(); // 登录成功后清空输入和错误提示 txtUsername.Text = string.Empty; txtPassword.Text = string.Empty; lblUsername.Text = string.Empty; lblPassword.Text = string.Empty; } else { lblPassword.Text = "Incorrect Password"; lblUsername.Text = string.Empty; } }
改动说明
- 空值校验新增空白字符判断和return阻断逻辑,避免无效校验
- 无需手动遍历整个账户集合,
FirstOrDefault会直接返回第一个匹配用户名的账户,查询效率更高 - 仅对匹配到的单个账户做PIN校验,不会出现错误提示被遍历覆盖的问题
- 登录成功后传入当前账户实例到主界面,后续办理交易时无需重复读取CSV文件,可直接操作当前账户的属性
内容的提问来源于stack exchange,提问作者Herman Kapange
相关产品推荐
相关产品推荐

