是否存在C#大小写不敏感的等于运算符?

Gat*_*ler 151 .net c# string operators case-insensitive

我知道以下是区分大小写的:

if (StringA == StringB) {
Run Code Online (Sandbox Code Playgroud)

那么有一个运算符会以不敏感的方式比较两个字符串吗?

Joh*_*lla 284

试试这个:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要文化敏感的比较,请使用此方法.如果您只想确保"FILE"和"file"都被接受,请使用"OrdinalIgnoreCase",否则您的代码可能无法在土耳其语语言环境中使用.有关详细信息,请参阅http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html (53认同)
  • 不确定塞缪尔在谈论什么......这个答案是完美的.它的正确和不言自明.它不需要参考.+1 (10认同)
  • @Sanjay Manohar然后编写一个自定义操作符 - 我建议使用更好的键盘. (9认同)
  • 唉这真是太可怕了!我的键盘会磨损.我可以使用"`如果A $ = B $然后转到10"的日子已经一去不复返了 (3认同)

Pav*_*dov 32

比较2个字符串忽略字母大小写的最佳方法是使用String.Equals静态方法指定序数忽略大小写字符串比较.这也是最快的方法,比将字符串转换为大写或大写更快,并在此之后进行比较.

我测试了两种方法的性能和序数忽略情况下字符串比较快了9倍!它比将字符串转换为小写或大写更可靠(请查看土耳其语问题).因此,始终使用String.Equals方法来比较字符串是否相等:

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

如果要执行特定于区域性的字符串比较,可以使用以下代码:

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

请注意,第二个示例使用当前区域性的字符串比较逻辑,这使得它比第一个示例中的"序数忽略大小写"比较慢,因此如果您不需要任何特定于区域性的字符串比较逻辑,那么在最大性能之后,使用"序数忽略情况"比较.

有关更多信息,请阅读我博客上的完整故事.

  • "我们大多数人都知道这些潜在的问题,互联网上的许多教程都以土耳其语'我'为例" - 人不够,而且你仍然提到它是你答案中的第二句话.此外,你的*答案*没有足够的理由从不使用它 - 你只是提到表现; 表现并不总是最重要的.因此,您目前违反了帮助中心指南; 链接到外部网站是好的,但你没有充分总结内容(土耳其'我'问题).所以不是你的广告平台. (3认同)
  • 不要建议使用 `ToLower` 或 `ToLowerInvariant`:它们创建内存只是为了执行比较,并且当新字符集添加到 unicode 时它们可能会失败。`ToUpper` 因土耳其语“i”等原因而失败;没有理由为什么`ToLower` 将来不会因为类似的原因而失败。 (2认同)

Rya*_*ndy 19

StringComparer静态类上有许多属性可以为您可能需要的任何类型的区分大小写返回比较器:

StringComparer 属性

例如,你可以打电话

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)
Run Code Online (Sandbox Code Playgroud)

要么

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)
Run Code Online (Sandbox Code Playgroud)

这比清洁有点string.Equals或者string.Compare是采取重载StringComparison的说法.


lep*_*pie 15

System.Collections.CaseInsensitiveComparer
Run Code Online (Sandbox Code Playgroud)

要么

System.StringComparer.OrdinalIgnoreCase
Run Code Online (Sandbox Code Playgroud)

  • 我在哪里可以找到更多相关信息.这是否意味着我可以使用==进行不区分大小写的匹配? (3认同)

Eri*_*ick 9

string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)


Grz*_*nio 7

要么

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {
Run Code Online (Sandbox Code Playgroud)

但是你需要确保StringA不为null.所以可能更好的使用:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

正如约翰所说

编辑:纠正了错误