You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

改动说明

  1. 空值校验新增空白字符判断和return阻断逻辑,避免无效校验
  2. 无需手动遍历整个账户集合,FirstOrDefault会直接返回第一个匹配用户名的账户,查询效率更高
  3. 仅对匹配到的单个账户做PIN校验,不会出现错误提示被遍历覆盖的问题
  4. 登录成功后传入当前账户实例到主界面,后续办理交易时无需重复读取CSV文件,可直接操作当前账户的属性

内容的提问来源于stack exchange,提问作者Herman Kapange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:18:02