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

使用Array.Find()无法正确验证账号密码,登录需重复输入

登录验证系统需重复输入两次账号密码问题排查

我正在开发一套用户名密码登录验证系统,需要验证用户输入的账号密码是否匹配对象数组中的数据。采用Array.Find()实现后,运行程序时需重复输入两次正确的账号密码才能完成登录,不符合预期。尝试过foreach循环、FirstOrDefault()等方法,问题仍存在,附上相关C#代码请求排查错误。


主程序代码片段

Utilizador[] usersIniciais = utilizadoresDefault.UtilizadoresDefault(utilizadoresDefault.GenerateID());
PersonalTrainer[] ptsIniciais = ptsDefault.PTsDefault(utilizadoresDefault.GenerateID());

int option = novoLogin.LoginInicial();
Tuple<string, string> strings = novoLogin.DadosLogin(option);
string username = strings.Item1;
string password = strings.Item2;

novoLogin.ValidacaoDados(username, password, usersIniciais);
Console.ReadLine();
}
}

Login类代码

namespace RSGymPT.Classes
{
    internal class Login
    {
       
        public static void Log(string Username)
        {
            Console.WriteLine($"User Logged: {Username}");
        }

        public int LoginInicial()
        {
            int option;

            do
            {
                Console.Clear();
                Console.WriteLine("Seleciona a opção pretendida: \n");
                Console.WriteLine("1. Login");
                Console.WriteLine("2. Sair\n");

                Console.Write("A tua opção: ");
                Int32.TryParse(Console.ReadLine(), out option);

            } while (option != 1 && option != 2);
            return option;
        }

        public Tuple<string, string> DadosLogin(int option)
        {
            if (option == 1)
            {
                Console.Clear();
                Console.WriteLine("Please insert your Login data: \n");
                Console.Write("User: ");
                Username = Console.ReadLine();
                Console.Write("Password: ");
                Password = Console.ReadLine();
                return Tuple.Create(Username, Password);
            }
            else if (option == 2)
            {
                Console.Clear();
                Console.WriteLine("See you soon.\n");
                Console.ReadKey();
                Environment.Exit(0);
            }
            return Tuple.Create(Username, Password);
        }


        public void ValidacaoDados(string user, string password, Utilizador[] utilizadores)
        {
            Utilizador utilizador = Array.Find(utilizadores, element => element.NomeUtilizador == user);
            do
            {
                Console.Clear();
                Console.Write("User: ");
                Username = Console.ReadLine();
                Console.Write("Password: ");
                Password = Console.ReadLine();
               if (utilizador != null && utilizador.Password.Equals(password))
                {
                Console.WriteLine("Login correct");
                }
               else
                {
                    Console.WriteLine("Bye");
                    Console.ReadKey();
                    Console.WriteLine();
                    Environment.Exit(0);
                }
            } while (Username == null || Password == null);
        }

    }
}

Utilizador类代码片段

namespace RSGymPT.Classes
{
    internal class Utilizador
    {
        public Utilizador[] UtilizadoresDefault(int id)
        {
            Utilizador[] usersInicial = new Utilizador[]
            {
                new Utilizador {Id = GenerateID(), Nome = "user1", NomeUtilizador = "user1user", Password = "user1234"},
                new Utilizador {Id = GenerateID(), Nome = "user2", NomeUtilizador = "user2user", Password = "user1234"},
            };
                return usersInicial;
        }

        #endregion
    }
}

问题根源分析

  1. 重复收集用户输入:主程序已经通过DadosLogin()获取了用户的账号密码,但ValidacaoDados()方法内部又启动了do-while循环要求用户再次输入,直接导致用户需要输入两次。
  2. 验证逻辑与输入脱节:ValidacaoDados()用传入的user参数查找用户,验证时用的是传入的password参数,完全忽略了循环内用户新输入的Username和Password,逻辑不匹配。
  3. 循环条件错误:do-while的循环条件是Username == null || Password == null,意味着只要输入非空的账号密码,循环就会持续执行,即使用户验证成功,也会继续要求输入直到空值。

修复方案

方案1:直接验证传入参数(无重试)

public void ValidacaoDados(string user, string password, Utilizador[] utilizadores)
{
    Console.Clear();
    Utilizador utilizador = Array.Find(utilizadores, element => element.NomeUtilizador == user);
    if (utilizador != null && utilizador.Password.Equals(password))
    {
        Console.WriteLine("Login correct");
        Log(user);
    }
    else
    {
        Console.WriteLine("Invalid username or password");
        Console.ReadKey();
        Environment.Exit(0);
    }
}

方案2:整合输入与验证,支持重试

如果需要用户输入错误后可重试,将输入收集和验证放在同一循环内,避免重复收集:

// 修改主程序调用逻辑
int option = novoLogin.LoginInicial();
if (option == 1)
{
    novoLogin.ValidacaoDadosComRetry(usersIniciais);
}
else
{
    Console.Clear();
    Console.WriteLine("See you soon.\n");
    Console.ReadKey();
    Environment.Exit(0);
}

// 在Login类中添加带重试的验证方法
public void ValidacaoDadosComRetry(Utilizador[] utilizadores)
{
    bool loginSuccess = false;
    do
    {
        Console.Clear();
        Console.WriteLine("Please insert your Login data: \n");
        Console.Write("User: ");
        string username = Console.ReadLine();
        Console.Write("Password: ");
        string password = Console.ReadLine();

        Utilizador utilizador = Array.Find(utilizadores, element => element.NomeUtilizador == username);
        if (utilizador != null && utilizador.Password.Equals(password))
        {
            Console.WriteLine("Login correct");
            Log(username);
            loginSuccess = true;
        }
        else
        {
            Console.WriteLine("Invalid username or password. Press any key to try again.");
            Console.ReadKey();
        }
    } while (!loginSuccess);
}

内容的提问来源于stack exchange,提问作者Pedro L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:27:25