StringComparison.InvariantCultureIgnoreCase有快捷方式吗?

时间:2014-06-06 08:07:11

标签: c# .net string string-comparison

(请注意,我不确定我的问题是“偏离主题”还是“主要基于意见” - 只需告诉我,我将删除该问题)

进行大量不区分大小写的字符串比较,我结束了许多冗长的陈述,如:

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

困扰我的是StringComparison.InvariantCultureIgnoreCase的长名称。

我可以考虑使用扩展方法等来缩短我必须编写的代码,但另一方面我害怕“混淆”我的代码,从而使其更难理解。

所以我的问题是:

是否有“最佳做法”,即必须编写较少的文本并仍然进行InvariantCultureIgnoreCase式字符串比较?

4 个答案:

答案 0 :(得分:3)

您可以将其包裹在Extension Method

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 :(得分: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));
        }
    }
}

: - )

答案 2 :(得分:2)

您始终可以将其指定为常量:

public const StringComparison IGNORE_CASE= StringComparison.InvariantCultureIgnoreCase; //use whatever name you like

并将其放置在可以从您需要的任何地方引用的地方......(如果您需要在多个项目中使用它,就像在“实用程序”中一样)

现在你可以使用它而不是大枚举

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

答案 3 :(得分:1)

不知道框架中有任何捷径。如果你发现自己重复任何代码,你应该发挥作用。如果这是一个静态函数在许多地方都很有用,那么将它移到util类:

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 recommendations之后添加了一项更改,因为您可能不需要进行不变的比较。另见:Using InvariantCultureIgnoreCase instead of ToUpper for case-insensitive string comparisons