Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有StringComparison.InvariantCultureIgnoreCase的快捷方式?_C#_.net_String_String Comparison - Fatal编程技术网

C# 是否有StringComparison.InvariantCultureIgnoreCase的快捷方式?

C# 是否有StringComparison.InvariantCultureIgnoreCase的快捷方式?,c#,.net,string,string-comparison,C#,.net,String,String Comparison,在进行大量不区分大小写的字符串比较后,我最后给出了大量冗长的语句,如: myList.FirstOrDefault( c => string.Equals( c.InternalName, internalName, StringComparison.InvariantCultureIgnoreCase)); 困扰我的是StringComparison.InvariantCultureIgnoreC

在进行大量不区分大小写的字符串比较后,我最后给出了大量冗长的语句,如:

myList.FirstOrDefault(
    c => string.Equals(
             c.InternalName, 
             internalName, 
             StringComparison.InvariantCultureIgnoreCase));
困扰我的是
StringComparison.InvariantCultureIgnoreCase
的长名称

我可以考虑使用扩展方法之类的方法来缩短我必须编写的代码,但另一方面,我担心会“混淆”我的代码,从而使代码更难理解

所以我的问题是:

是否有一种“最佳实践”,即必须编写更少的文本,但仍要进行
不变量文化识别代码
样式的字符串比较?

您可以:

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));
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用s=System.String;
使用sc=System.StringComparison;
使用l=System.Collections.Generic.List;
名称空间测试
{
课堂测试
{
私有sc-cic=sc.InvariantCultureIgnoreCase;
公共c类
{
公共服务一级;
}
私人无效测试(s i)
{
l ml=新的l();
第一默认值(
c=>s.等于(
c、 我,,
我
中投),;
}
}
}

:-)

您可以用
扩展方法将其包装起来

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))

您始终可以将其指定给常数:

public const StringComparison IGNORE_CASE= StringComparison.InvariantCultureIgnoreCase; //use whatever name you like
并将其放置在可以从您需要的任何位置引用的位置…(如果您需要在多个项目中使用它,则可将其放置在“实用程序”dll中)

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

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

不知道框架中有什么捷径。如果您发现自己在重复任何代码,您应该创建一个函数。如果静态函数在许多地方都很有用,那么将其移动到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的建议:@weston谢谢。似乎我应该使用
OrdinalIgnoreCase
来代替(这也有点短!)。我使用的是一个扩展方法,它工作得很好,我不认为它会混淆我的代码。我的队友使用它也很舒服。即
EqualsIgnoreCase
Why 3个参数?如何使用它?不是
StringComparer
,而是
stringcomparation
。这隐藏了一个事实,即它使用的是不变量区域性,与其他所有字符串方法不同。谢谢,很抱歉为它担心。谢谢!可能是唯一的出路。