有没有一个针对StringComparison.InvariantCultureIgnoreCase的快捷方式?

4

我的代码中有很多大小写不敏感的字符串比较,结果会得到很多冗长的语句,例如:

myList.FirstOrDefault(
    c => string.Equals(
             c.InternalName, 
             internalName, 
             StringComparison.InvariantCultureIgnoreCase));

让我感到困扰的是 StringComparison.InvariantCultureIgnoreCase 这个冗长的名称。

我可以想到使用扩展方法等方式来缩短需要编写的代码,但另一方面,我担心"混淆"我的代码,从而使它更难理解。

因此我的问题是:

是否有“最佳实践”可以写更少的文本,仍然可以进行类似 InvariantCultureIgnoreCase 的字符串比较?


2
顺便提一下,您是否了解序数比较和不变比较之间的区别:https://dev59.com/8XE95IYBdhLWcg3wkeqq#2256491以及微软的建议:http://msdn.microsoft.com/en-us/library/ms973919.aspx - weston
@weston 谢谢。看来我应该使用 OrdinalIgnoreCase(这也更短一些!)。 - Uwe Keim
1
我正在使用一个扩展方法,它运行良好,我认为它不会使我的代码混乱。我的团队成员也很舒适地使用它。它的名称是EqualsIgnoreCase - Sriram Sakthivel
4个回答

4
您可以使用扩展方法来包装它:

你可以在一个扩展方法中将其包装:

public static class StringExtensions
{
    public static bool EqualsCaseInsensitive(this string str, string other)
    {
        return string.Equals(str, other, StringComparison.InvariantCultureIgnoreCase);
    }
}

然后执行:

myList.FirstOrDefault(
    c => c.InternalName.EqualsCaseInsensitive(internalName))

1
为什么需要3个参数?你如何使用它? - weston
1
不是StringComparer,而是StringComparison - Sriram Sakthivel
这将隐藏它使用 InvariantCulture 而不是其他每个字符串方法的事实。 - Kugel

2
您可以这样做:
myList.FirstOrDefault(
    c => string.Equals(
             c.InternalName, 
             internalName, 
             (StringComparison)3);

无论如何…我认为你不应该担心这种事情。
编辑:
如果您想使其真正简短,可以采取以下措施:
using System;
using System.Collections.Generic;
using System.Linq;
using s = System.String;
using sc = System.StringComparison;
using l = System.Collections.Generic.List<Test.Test.c>;

namespace Test
{
    class Test
    {
        private sc cic = sc.InvariantCultureIgnoreCase;

        public class c
        {
            public s i;
        }

        private void Test(s i)
        {
            l ml = new l();

            ml.FirstOrDefault(
                c => s.Equals(
                         c.i, 
                         i,
                         cic));
        }
    }
}

:-)


感谢您,对此事感到抱歉让您担心了。 - Uwe Keim

2
您可以始终将其分配给常量:
public const StringComparison IGNORE_CASE= StringComparison.InvariantCultureIgnoreCase; //use whatever name you like

将它放在任何需要的地方,可以从任何地方引用它...(比如在一个"utility" dll中,如果你需要在多个项目中使用它)

现在你可以使用它来代替大型枚举

myList.FirstOrDefault(
    c => string.Equals(
         c.InternalName, 
         internalName, 
         IGNORE_CASE));

1

框架中没有任何捷径。如果发现自己重复编写任何代码,应该将其制作为一个函数。如果该函数在多个地方都有用,则将其移动到工具类中:

myList.FirstOrDefault(
    c => Are.SameIgnoringCase(
             c.InternalName, 
             internalName));

public static class Are {
  public boolean SameIgnoringCase(string a, string b)
  {
    return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
  }
}

我给这个类起了一个相当神秘的名字,但它会导致代码更易读。
我已经包含了一个更改,遵循Microsoft建议,因为您可能不需要不变比较。还请参考:使用InvariantCultureIgnoreCase代替ToUpper进行大小写不敏感的字符串比较

谢谢!可能是唯一可行的方法。 - Uwe Keim

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