【问题标题】:C# Comparing strings with different case [duplicate]C#比较不同大小写的字符串[重复]
【发布时间】:2010-06-25 15:13:59
【问题描述】:

我正在读取用户名,然后检查是否存在于另一个数据库表中,问题是用户名相同但大小写可能不同,并阻止它找到匹配示例 jsmith 和 JSmith 或 JSMITH。

我该如何解决这个问题?我应该在写入第一个数据库时降低大小写,还是在比较两者时可以更改下面的代码?

drUser["Enrolled"] = 
    (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);

更新:

仍在为此苦苦挣扎,下面的代码编译但没有给出正确的结果,查看已注册用户时,我看到未注册的用户,查看未注册用户时,我看到 1 已注册但他们的用户名每个数据库中的大小写相同。我是否正确格式化了下面的代码?

drUser["Enrolled"] = (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));

谢谢 杰米

【问题讨论】:

  • 该死,我太慢了。认为我回答这个问题比较合适.. ;)
  • @SLaks 他的示例名称.. 是我的用户名.. :)
  • @Jamie:当我遇到看起来应该有效但无效的代码时,我发现分解它并检查我的所有假设很有帮助。 IE。当您比较两个字符串时,Equals() 是否符合您的预期(如下文所述,文化设置会有所不同)。如果可行,则检查 FindIndex 是否适用于完全匹配。等等等等。
  • 您可能想使用 Exists() 之类的东西,请参阅下面的答案。
  • 值得注意的是,对于某些字符集,转换为大写而不是小写更有效。此外,这正是存储过程的用途。

标签: c# string comparison case-insensitive


【解决方案1】:

您需要调用Equals method,它采用StringComparison 参数。

例如:

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)

如果x.Username可以是null,你应该调用static Equals method

String.Equals(x.Username, (string)drUser["Username"], StringComparison.OrdinalIgnoreCase)

否则,x.Username.Equals 可以抛出 NullReferenceException

【讨论】:

  • 对不起,听起来很厚,但下面的代码不能正常工作,它编译但没有找到匹配的用户。 drUser["Enrolled"] = (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));
  • 刚刚尝试了更新,但无法编译。我哪里错了? drUser["Enrolled"] = (enrolledUsers.FindIndex(String.Equals(x.Username, (string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));
  • 请编辑您的问题并添加您的确切代码。
【解决方案2】:

这样做的首选方法是使用类似的东西指定字符串比较

string.Equals(x.Username, (string)drUser["Username"], StringComparison.OrdinalIgnoreCase

进行相等性检查,而不是“==”

【讨论】:

  • 这不会编译(你忘了转换)。
【解决方案3】:

你试过了吗?

string userName = (string)drUser["Username"];
bool enrolled = enrolledUsers.Exists(x =>
  string.Equals(x.Name, userName, StringComparison.CurrentCultureIgnoreCase));

您使用 FindIndex 有什么原因吗?

【讨论】:

    【解决方案4】:

    试试 string.compare 方法。 all overloads

    或者更多specific one

    如果没有别的,我希望它有教育意义。

    【讨论】:

      【解决方案5】:

      使用 ToUpper() 怎么样。

       if(!(dr["Enrolled"] == null || dr["Username"] == null))
       {
          if(dr["Enrolled"].ToString().ToUpperInvariant()== dr["Username"].ToString().ToUpperInvariant())
          {
              //Do Something
          }
      }
      

      【讨论】:

      • 请提供否决票的理由。我想了解为什么这段代码是一种不好的做法。谢谢
      • 我没有对你投反对票,但我可以猜到原因。首先,如果任何一个值为空,这将爆炸。其次,这不是文化意识。它可能适用于英语(以及许多其他语言),但不是全部。经常被引用的例子是“土耳其案例”:moserware.com/2008/02/does-your-code-pass-turkey-test.html .Net 免费为您提供具有文化意识的字符串比较 - 使用它们!
      • 太远了....感谢您的解释。非常感激。是的,就 NULL 而言......代码示例并不是为了防弹。我总是检查 NULL。
      • 旁注:ToUpperInvariant 将是您的最佳选择。
      • 附带说明,ToUpper 还创建了一个全新的字符串,这是额外的开销。在这里或那里的小字符串没什么大不了的,但是如果您要进行很多比较,那么创建一个临时的来进行比较似乎有点浪费。
      猜你喜欢
      • 2012-02-29
      • 2014-06-20
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 2014-07-19
      • 2011-06-22
      • 2013-01-27
      相关资源
      最近更新 更多