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

3
我想要比较两个字符串,但不区分大小写,但我不确定最好的方法是什么。这些字符串的平均长度为20,这个问题更多地涉及现有技术,而不是最佳性能。
我的大部分代码使用
bool output = "foo".ToLower() == "FOO".ToLower();

我认为这种方式有点老式了。另一种我看过很多次的方法是:
bool output = Regex.IsMatch("foo", "FOO", RegexOptions.IgnoreCase);

我猜这是可能的,但正则表达式并不适用于这样简单的事情。
之后还剩下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);

这是一个基于个人观点的问题。但我的看法是:string.Equals("x", "y", StringComparison.OrdinalIgnoreCase) - Gilad Green
源代码中没有IndexOf选项? - Prix
也可以看看这里:https://dev59.com/dXA75IYBdhLWcg3wv7_A 和 https://dev59.com/Lmw15IYBdhLWcg3w1vOB - Gilad Green
你说的“最好”是指什么?最高性能、最短、最易读? - nicks
@NikaGamkrelidze 第二句话已经说了一切。 - Toshi
3个回答

4
如果您查看相应的参考来源,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 显然是一个过度设计(你只需要比较字符串即可);ToLower() 在处理特定文化字母时可能会有问题,请参见https://en.wikipedia.org/wiki/Dotted_and_dotless_I。因此,更好的设计是明确声明你的意图(我想要比较字符串),然后掩盖它们(让系统欺骗你)。

1
如果您正在检查相等性,请使用“Equals”。使用“Compare”相当于使用。
if (collection.Count() == 0)

替代

if (collection.Any())

在LINQ中。即使这两个可能当前已经实现并且执行类似,但您掩盖了您的意图,并且未来也不能保证情况相同。


但是 Compare 还确定了排序顺序(-1、0、1),而 Equals 只是检查相等,对吗? - Toshi
没错。如果你关心两个项目是否相等,你应该调用检查它们是否相等的方法,而不是检查一个是否比另一个大或小的方法。 - Rawling

-2

我认为这很不错。

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

6
我认为正则表达式是你最后应该考虑的事情,只有当其他方法都失败时才能派上用场。这表明这个问题是基于个人观点的,因此在这里属于离题。 - slawekwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接