2015-03-02 89 views
-1

我試圖在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

回答

3

你真的應該分開你的用戶名和密碼。 請使用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

0

你正在做這一切是錯誤的。不是檢查用戶名列表,而是檢查每個元素是否包含用戶名。因此,如果列表中的最後一項不是用戶在文本框中輸入的用戶名,那麼它會給你所得到的結果。

你在做什麼不是你的首選,而應該用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

相關問題