C#用户名比较(2个字符串)
好吧,我想我遗漏了一些很明显的东西。我只是需要一双新鲜的眼睛来看看,我累了 我实际上只是比较if语句中的两个字符串,但它不认为这是相同的C#用户名比较(2个字符串),c#,mysql,string,visual-studio,C#,Mysql,String,Visual Studio,好吧,我想我遗漏了一些很明显的东西。我只是需要一双新鲜的眼睛来看看,我累了 我实际上只是比较if语句中的两个字符串,但它不认为这是相同的 public Boolean checkusn(String username) { MySqlDataReader reader = sendcmd("SELECT username FROM `users`"); Boolean taken = true; while (reader.Read())
public Boolean checkusn(String username)
{
MySqlDataReader reader = sendcmd("SELECT username FROM `users`");
Boolean taken = true;
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write(reader.GetString(i) + " " + username + " ");
if (username == reader.GetString(i))
{
taken = false;
label17.Text = "Username already taken";
}
else
{
taken = true;
label17.Text = "Username not taken";
}
}
}
return taken;
}
因此,将干草与干草进行比较,并将干草与试验进行比较。
但是它不认为它们是相同的….不要使用
==
由此
比较字符串时,应使用显式指定要执行的比较类型的方法。这使您的代码更易于维护和可读。尽可能使用System.String和System.Array类的方法重载,这些方法采用StringComparison枚举参数,以便指定要执行的比较类型。最好避免使用==和!=比较字符串时使用运算符。另外,避免使用String.CompareTo实例方法,因为所有重载都不接受StringComparation
不要使用
==
由此
比较字符串时,应使用显式指定要执行的比较类型的方法。这使您的代码更易于维护和可读。尽可能使用System.String和System.Array类的方法重载,这些方法采用StringComparison枚举参数,以便指定要执行的比较类型。最好避免使用==和!=比较字符串时使用运算符。另外,避免使用String.CompareTo实例方法,因为所有重载都不接受StringComparation
当take==true时,应该保留循环。
现在,您总是只返回表中最后一个元素的bool值。当take==true时,您应该保留循环。
现在您总是只返回表中最后一个元素的布尔值。谢谢大家的提示,我不经常使用c。虽然你提到的不是事实,但它帮助我发现了我的错误
当for循环找到用户名时,我愚蠢地没有停止它,因此当它转到列表中的下一个用户名时,它会将其设置回true。谢谢大家的提示,我不经常使用c。虽然你提到的不是事实,但它帮助我发现了我的错误
我愚蠢地没有在for循环找到用户名后停止它,因此当它转到列表中的下一个用户名时,它会将其设置回true。我简化了您解决问题的方法,并希望使其更易于维护和理解。变化包括:
- 纠正逻辑错误(发现时中断循环)
- 确保以某种方式实际验证传入的参数(至少现在删除了前导/尾随空格)
- 显式执行不区分大小写的比较(如果愿意,可以使用string.compare)
- 代码缩减
public bool checkusn(String username) { MySqlDataReader reader = sendcmd("SELECT username FROM `users`"); int foundCount = 0; string usernamePassedIn = username.Trim().ToUpper(); while (reader.Read() && foundCount == 0) { for (int i = 0; i < reader.FieldCount; i++) { string usernameReadFromDb = reader.GetString(i).Trim().ToUpper(); if (usernamePassedIn == usernameReadFromDb) foundCount++; if (foundCount > 0) break; } } label17.Text = foundCount > 1 ? "Username already taken" : "Username not taken"; return foundCount > 0; }
我简化了您解决这些问题的方法,并希望使其更易于维护和理解。变化包括:- 纠正逻辑错误(发现时中断循环)
- 确保以某种方式实际验证传入的参数(至少现在删除了前导/尾随空格)
- 显式执行不区分大小写的比较(如果愿意,可以使用string.compare)
- 代码缩减
public bool checkusn(String username) { MySqlDataReader reader = sendcmd("SELECT username FROM `users`"); int foundCount = 0; string usernamePassedIn = username.Trim().ToUpper(); while (reader.Read() && foundCount == 0) { for (int i = 0; i < reader.FieldCount; i++) { string usernameReadFromDb = reader.GetString(i).Trim().ToUpper(); if (usernamePassedIn == usernameReadFromDb) foundCount++; if (foundCount > 0) break; } } label17.Text = foundCount > 1 ? "Username already taken" : "Username not taken"; return foundCount > 0; }
使用
not==请注意,默认情况下,SQL中的文本比较不区分大小写,但在C中是区分大小写的。您的string.Equals(string2)
和take=false
的方法是错误的。您应该学习如何使用断点以及如何逐步完成代码。这让生活变得容易多了。使用take=true
not==请注意,默认情况下,SQL中的文本比较不区分大小写,但在C中是区分大小写的。您的string.Equals(string2)
和take=false
的方法是错误的。您应该学习如何使用断点以及如何逐步完成代码。这让生活变得容易多了。有人在这个问题上否决了微软自己的建议…太棒了。因为编写和维护该语言的人一定是错的。哈哈。我会投票来平衡。当你比较字符串时,你或其他不是take=true
对象的值时,使用
当比较对象相等时,使用=
方法..@MethodMan您正在考虑Java。这不是一个答案,因为它只是一个清晰的指南,而不是解决一个隐藏问题的东西(在99.99999%的场景中)@RJM也投了赞成票。最佳实践是在框架级别使用默认重载,在.Equals方法中实现stringcomparison。在我自己的例子中,我有IdEquals(a.Equals(b,StringComparison.OrdinalIgnoreCase)常规的等于w/InvariantIgnoreCase。有人在这个问题上否决了微软自己的建议……太棒了。因为编写和维护该语言的人一定是错的。lol。我会投票来平衡。当你比较字符串时,你或其他非.Equals
对象的值使用
当比较对象相等性时,使用t他=
Method..@MethodMan您正在考虑Java。这不是一个答案,因为它只是一个清晰的指南,而不是解决隐藏问题的方法(在99.99999%的场景中)@RJM也是向上投票的。最佳实践是在框架级别上有一个默认重载,在.Equals方法中实现stringcomparison。在我自己的方法中,我有IdEquals(a.Equals(b,stringcomparison.OrdinalIgnoreCase)常规的等于w/InvariantIgnoreCase.ah,我看到了你在Flott之后的评论。谢谢!啊,我看到了你在Flott之后的评论。谢谢!for循环用于循环从数据库中提取的每个用户名。因为每个结果都引用了。GetString(这个数字引用了找到的每个结果)因此0将返回第一个结果。对于大型数据库来说,这似乎效率低下,但我只是个业余爱好者.Equals
public bool checkusn(String username) { MySqlDataReader reader = sendcmd("SELECT username FROM `users`"); int foundCount = 0; string usernamePassedIn = username.Trim().ToUpper(); while (reader.Read() && foundCount == 0) { string usernameReadFromDb = reader.GetString(0).Trim().ToUpper(); if (usernamePassedIn == usernameReadFromDb) foundCount++; } label17.Text = foundCount > 1 ? "Username already taken" : "Username not taken"; return foundCount > 0; }