c# - 忽略大小写比较两个字符串的最佳方法

标签 c# string

<分区>

我想比较两个不区分大小写的字符串,但我不确定最好的方法。字符串的平均长度为 20,这个问题更多的是关于最先进的技术,而不是关于最佳性能

我的大部分代码使用

bool output = "foo".ToLower() == "FOO".ToLower();

这对我来说似乎有点过时了。我见过很多次的另一种方式是

bool output = Regex.IsMatch("foo", "FOO", RegexOptions.IgnoreCase);

我想这是可能的,但 RegEx 不是为这么简单的事情而设计的。

之后还剩下 3 个“好的”方式:

bool output = string.Compare("foo", "FOO", StringComparison.CurrentCultureIgnoreCase) == 0;
bool output = string.Compare("foo", "FOO", true) == 0;
bool output = "foo".Equals("FOO", StringComparison.CurrentCultureIgnoreCase);

最佳答案

如果你看看相应的引用资料

https://referencesource.microsoft.com/#mscorlib/system/string.cs,bda3b2c94b5251ce

    public static int Compare(String strA, String strB, bool ignoreCase)
    {
        if (ignoreCase) {
            return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
        }
        return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);
    }

https://referencesource.microsoft.com/#mscorlib/system/string.cs,0be9474bc8e160b6

    public static int Compare(String strA, String strB, StringComparison comparisonType) 
    {
    ... 
        // Agrument validation, reference equality, null test

        switch (comparisonType) {
        ...
           case StringComparison.CurrentCultureIgnoreCase:
                return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);

https://referencesource.microsoft.com/#mscorlib/system/string.cs,d47c1f57ad1e1e6e

    public static bool Equals(String a, String b, StringComparison comparisonType) {
    ... 
       // Agrument validation, reference equality, null test

       switch (comparisonType) {
        ...
           case StringComparison.CurrentCultureIgnoreCase:
                return (CultureInfo.CurrentCulture.CompareInfo.Compare(a, b, CompareOptions.None) == 0);

您会发现这三种方法相同。至于其他方式,Regex.IsMatch肯定是overshoot(你要做的就是比较字符串); ToLower() 在处理特定于文化的字母时可能会很棘手,请参阅

https://en.wikipedia.org/wiki/Dotted_and_dotless_I

这就是为什么更好的设计是清楚地声明您的意图(=我想比较字符串)然后掩盖它们(让系统欺骗您)

关于c# - 忽略大小写比较两个字符串的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39889362/

相关文章:

c# - 返回任务的结果 - 包括异常?

python - 在 python 中第 n 次出现主题标签之前拆分单词中的字符串

jquery - 使用jquery clone创建div元素,如何设置ID标签?

c# - 在 C# 中获取最后 'N' 个季度

c# - 利用 IIS 中的浏览器缓存(谷歌页面速度问题)

c# - 如何防止 .NET 库在关闭时发送 RST 数据包

c# - 创建新的 WPF 项目时已添加具有相同键的项目

html - 将存储的包含 html 标签的字符串转换为 html 文本格式

c - 理解C中的解引用运算符和指针,以及一个小程序的逻辑

c - 分割字符串的函数有时会出现段错误