使用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 } }
问题根源分析
- 重复收集用户输入:主程序已经通过
DadosLogin()获取了用户的账号密码,但ValidacaoDados()方法内部又启动了do-while循环要求用户再次输入,直接导致用户需要输入两次。 - 验证逻辑与输入脱节:
ValidacaoDados()用传入的user参数查找用户,验证时用的是传入的password参数,完全忽略了循环内用户新输入的Username和Password,逻辑不匹配。 - 循环条件错误:
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
相关产品推荐
相关产品推荐

