比较两个字符串忽略大小写

时间:2016-10-06 06:51:12

标签: 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);

3 个答案:

答案 0 :(得分: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肯定是 overhoot (你要做的就是比较字符串);处理特定文化字母时,ToLower()可能会很棘手,请参阅

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

这就是为什么一个更好的设计是明确地宣告你的意图 (=我想要比较字符串)然后掩盖它们(并让系统解雇你)

答案 1 :(得分:1)

如果您要检查是否相等,请使用Equals。使用Compare等同于使用

if (collection.Count() == 0)

而不是

if (collection.Any())
在LINQ中

。即使这两者目前可以实施并且表现相似,但您仍然掩盖了您的意图,并且您未来也没有保证

答案 2 :(得分:-1)

我认为这很好

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