C#用户名比较(2个字符串)

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())

好吧,我想我遗漏了一些很明显的东西。我只是需要一双新鲜的眼睛来看看,我累了

我实际上只是比较if语句中的两个字符串,但它不认为这是相同的

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;
      }
      


      使用
      string.Equals(string2)
      not==请注意,默认情况下,SQL中的文本比较不区分大小写,但在C中是区分大小写的。您的
      take=false
      take=true
      的方法是错误的。您应该学习如何使用断点以及如何逐步完成代码。这让生活变得容易多了。使用
      string.Equals(string2)
      not==请注意,默认情况下,SQL中的文本比较不区分大小写,但在C中是区分大小写的。您的
      take=false
      take=true
      的方法是错误的。您应该学习如何使用断点以及如何逐步完成代码。这让生活变得容易多了。有人在这个问题上否决了微软自己的建议…太棒了。因为编写和维护该语言的人一定是错的。哈哈。我会投票来平衡。当你比较字符串时,你或其他不是
      对象的值时,使用
      =
      当比较对象相等时,使用
      .Equals
      方法..@MethodMan您正在考虑Java。这不是一个答案,因为它只是一个清晰的指南,而不是解决一个隐藏问题的东西(在99.99999%的场景中)@RJM也投了赞成票。最佳实践是在框架级别使用默认重载,在.Equals方法中实现stringcomparison。在我自己的例子中,我有IdEquals(a.Equals(b,StringComparison.OrdinalIgnoreCase)常规的等于w/InvariantIgnoreCase。有人在这个问题上否决了微软自己的建议……太棒了。因为编写和维护该语言的人一定是错的。lol。我会投票来平衡。当你比较字符串时,你或其他非
      对象的值使用
      =
      当比较对象相等性时,使用t他
      .Equals
      Method..@MethodMan您正在考虑Java。这不是一个答案,因为它只是一个清晰的指南,而不是解决隐藏问题的方法(在99.99999%的场景中)@RJM也是向上投票的。最佳实践是在框架级别上有一个默认重载,在.Equals方法中实现stringcomparison。在我自己的方法中,我有IdEquals(a.Equals(b,stringcomparison.OrdinalIgnoreCase)常规的等于w/InvariantIgnoreCase.ah,我看到了你在Flott之后的评论。谢谢!啊,我看到了你在Flott之后的评论。谢谢!for循环用于循环从数据库中提取的每个用户名。因为每个结果都引用了。GetString(这个数字引用了找到的每个结果)因此0将返回第一个结果。对于大型数据库来说,这似乎效率低下,但我只是个业余爱好者
          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;
          }