验证检查以查看列表中是否存在项目c#
我试图在C#中的列表中执行验证检查。该列表包含一个用户名和哈希密码。它看起来像:验证检查以查看列表中是否存在项目c#
Shaun,ewoaih3243nfeiwo
John, fewafwea231232
Alex, fhi34325325325
因此,例如肖恩是Username
和ewoaih3243nfeiwo
是password
。我正在读取函数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;
}
你真的应该分开你的用户名和密码。 请使用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...
这是一个不错的选择,我的答案试图保留您的原创设计,但从长远来看这会产生更好的结果。 – 2015-03-02 18:54:36
谢谢@SteveMitcham。 :) – 2015-03-02 18:55:40
谢谢@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*/}
那我该怎么做对不对? – 2015-03-02 18:43:37
不要通过for-loop运行检查。列表
或许确保您通过文本框修整用户输入?任何空白字符都会导致它们不匹配。另外,我会转储Read()方法产生的任何内容,只是为了快速进行完整性检查,并确保在迭代列表时确保您获得匹配。 – 2015-03-02 18:43:26
列表的内容是否具有已知格式?那就是你有一个例子,在名字和哈希密码之间用逗号隔开,而另一个用逗号和空格隔开。 – juharr 2015-03-02 18:49:06