验证检查以查看列表中是否存在项目c#

问题描述:

我试图在C#中的列表中执行验证检查。该列表包含一个用户名和哈希密码。它看起来像:验证检查以查看列表中是否存在项目c#

Shaun,ewoaih3243nfeiwo 
John, fewafwea231232 
Alex, fhi34325325325 

因此,例如肖恩是Usernameewoaih3243nfeiwopassword。我正在读取函数Read中的数据库中的这个列表。

这里是我的代码:

private void LoginButton_Click(object sender, EventArgs e) 
    { 
     List<string> List = Read(); 

     label3.Text = null; 
     textBox2.Text = null; 

     string Username = textBox1.Text; 
     string Password = textBox2.Text; 
     String hashPassword = passHash.HashPass(Password); 



     for (int i = 0; i < List.Count; i++) 
     { 

      if (List[i].Contains(Username)) 
      { 
       if (List[i].Contains(hashPassword)) 
       { 
        MessageBox.Show("Welcome, " + textBox1.Text + ". Logging in...", "Welcome"); 
        Form.ActiveForm.Hide(); 
        Main.FrontWindow Start = new Main.FrontWindow(); 
        Start.ShowDialog(); 
       } 

       else 
       { 
        label3.Text = "Username and password do not match."; 
       } 

      } 
      else 
      { 
       label3.Text = "User does not exist"; 
      } 
     } 

    } 

然而,当我填写文本框和运行,我总是得到的结果是,用户不存在,即使它很清楚呢。例如,当我输入Shaun和一个不正确的密码时,它应该说用户名和密码不匹配时,它说,而不是用户不存在。

编辑:这里是我如何创建字典

public Dictionary<string, string> Read() 
    { 
     string username; 
     string password; 

     string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\A2 Computing\C# Programming Project\Database1.accdb"; 
     string SelectQuery = "SELECT Username, Password FROM users"; 
     OleDbConnection Connection = new OleDbConnection(ConnectionString); 
     OleDbCommand Command = new OleDbCommand(SelectQuery, Connection); 
     Command.Connection.Open(); 

     OleDbDataReader Reader = Command.ExecuteReader(CommandBehavior.CloseConnection); 

     List<string> usernameList = new List<string>(); 
     List<string> passwordList = new List<string>(); 
     while (Reader.Read()) 
     { 
      username = (string)Reader["Username"]; 
      string usernameAdd = Convert.ToString(username); 
      usernameList.Add(usernameAdd); 

      password = (string)Reader["Password"]; 
      string passwordAdd = Convert.ToString(password); 
      passwordList.Add(passwordAdd); 
     } 

     var userDictionary = usernameList.Zip(passwordList, (u, p) => new { u, p }) 
      .ToDictionary(x => x.u, x => x.p); 

     var userList = userDictionary.ToList(); 
      listBox1.DataSource = userList; 

     return userDictionary; 

    } 
+1

或许确保您通过文本框修整用户输入?任何空白字符都会导致它们不匹配。另外,我会转储Read()方法产生的任何内容,只是为了快速进行完整性检查,并确保在迭代列表时确保您获得匹配。 – 2015-03-02 18:43:26

+0

列表的内容是否具有已知格式?那就是你有一个例子,在名字和哈希密码之间用逗号隔开,而另一个用逗号和空格隔开。 – juharr 2015-03-02 18:49:06

你真的应该分开你的用户名和密码。 请使用Dictionary<string, string>

此外,不要使用for循环,然后检查它是否Contains()该项目。那只会是荒谬的!

你可以做一些事情如下:

Dictionary<string, string> namesPasswords = Read(); 

// ... hashing, etc. 

if(namesPasswords.Keys.Contains(Username)) 
    if(namesPasswords[Username].Equals(hashPassword)) 
     // Welcome... 
    else 
     // Error... 
+1

这是一个不错的选择,我的答案试图保留您的原创设计,但从长远来看这会产生更好的结果。 – 2015-03-02 18:54:36

+0

谢谢@SteveMitcham。 :) – 2015-03-02 18:55:40

+0

谢谢@chutzzz但是我有Equals函数的问题,它似乎不允许正确的输入,即使它是正确的。为什么我会遇到这个问题? – 2015-03-02 19:02:41

你正在做这一切是错误的。不是检查用户名列表,而是检查每个元素是否包含用户名。因此,如果列表中的最后一项不是用户在文本框中输入的用户名,那么它会给你所得到的结果。

你在做什么不是你的首选,而应该用Dictionary<string, string>List<KeyValuePair<string, string>>来保存你的用户名和密码。

虽然您所做的并不是首选,但您仍然可以添加指定的断点以使其正常工作。这个想法是,如果第一个IF找到一个用户名,那么该循环不应该继续,而应该打破它应该做的事情。

for (int i = 0; i < List.Count; i++) 
     { 

      if (List[i].Contains(Username)) 
      { 
       if (List[i].Contains(hashPassword)) 
       { 
        MessageBox.Show(
        "Welcome, 
        " + textBox1.Text + ". Logging in...", "Welcome"); 

        Form.ActiveForm.Hide(); 
        Main.FrontWindow Start = new Main.FrontWindow(); 
        Start.ShowDialog(); 
       } 

       else 
       { 
        label3.Text = "Username and password do not match."; 
       } 
       break; 
      } 
      else 
      { 
       label3.Text = "User does not exist"; 
      } 
     } 

另外,你也可以做到这一点(思想不是首选的)。
注意即时在这里写这段代码请检查编译错误。

var user = List 
.Select(e=>e.Split(",", StringSplitOptions.RemoveEmpty).Select(a=> 
new 
{ 
    Username = a[0].Trim(), 
    Password=a[1].Trim() 
})) 
.Where(o=>o.Username = Username /*username entered by the user*/) 
.SingleOrDefault(); 

if(user!=null) 
{ 
    if(user.Password == Password /*password entered by the user*/) {/*Valid User*/} 
    else{/*Invalid password OR Username*/} 
} 
else {/*User does not exist*/} 
+0

那我该怎么做对不对? – 2015-03-02 18:43:37

+2

不要通过for-loop运行检查。列表 .Contains将遍历列表中的内容。 – 2015-03-02 18:44:15