Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# C语言中字符串的无大小写比较#_C#_.net_String_String Comparison - Fatal编程技术网

C# C语言中字符串的无大小写比较#

C# C语言中字符串的无大小写比较#,c#,.net,string,string-comparison,C#,.net,String,String Comparison,假设我有两个字符串:a和b。为了比较忽略大小写时a和be是否具有相同的值,我始终使用: // (Assume a and b have been verified not to be null) if (a.ToLower() == b.ToLower()) 但是,使用Reflector,我在.NET Framework中看到过几次: // (arg three is ignoreCase) if (string.Compare(a, b, true) == 0) 我测试了哪个更快,并且

假设我有两个字符串:a和b。为了比较忽略大小写时a和be是否具有相同的值,我始终使用:

// (Assume a and b have been verified not to be null)

if (a.ToLower() == b.ToLower())
但是,使用Reflector,我在.NET Framework中看到过几次:

// (arg three is ignoreCase)

if (string.Compare(a, b, true) == 0)
我测试了哪个更快,并且每次使用字符串时,
ToLower()
beat
Compare()


是否有理由使用
Compare()
而不是
ToLower()
?关于不同的
文化信息
?我抓狂了。

ToLower()不是一个比较函数,它把字符串放在小写。当==运算符用于C#中的字符串对象时,编译器会对其进行优化。在核心部分,两者都依赖于System.String.Equals,如Reflector中所示。

您应该关注的主要问题不是性能,而是正确性,从这个角度来看,您可能希望用于区分大小写比较的方法是:

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;

(如果您知道字符串可能为null,则第一个字符串很有用;如果您已经知道至少有一个字符串为非null,则编写后一个字符串更简单。我从未测试过性能,但假设性能类似。)


Ordinal
ordinallingorecase
是一种安全的赌注,除非你知道你想使用另一种比较方法;要获取做出决策所需的信息。

在比较字符串时,应始终使用显式StringComparison成员。字符串函数在选择比较字符串的方式上有些不一致。保证使用比较的唯一方法是a)记住所有的比较(包括你和你团队中的每个人)或b)对每个函数使用显式比较

最好是直截了当,不要依赖于团队知识的完善。你的队友会为此感谢你的

例如:

if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )
使用ToLower进行比较有两个问题,我可以马上想到

  • 它分配内存。比较函数不应该分配内存,除非它们必须这样做
  • 弦可以通过几种方式降低。最显著的顺序或文化敏感性较低。.ToLower()的工作方式是什么?就我个人而言,我不知道。传递明确的文化比依赖默认文化要好得多
    报告的备注部分应该解释一些事情。本质上,原因在于不同文化环境设置之间的兼容性。

    另一篇MSDN文章提供了一些应做和不应做的事情以及在各种情况下使用何种比较方法的建议:

    您能否发布测试,显示调用ToLower()比不区分大小写的比较快?我的测试结果正好相反!不管怎么说,其他海报关于正确性的观点都站得住脚。

    他的意思是ToLower()示例胜过(显式)Compare()示例。@Chris,国际化可能在这方面发挥了作用。好的,然后是string。Compare(a.ToLower(),b.ToLower())似乎比string快。Compare(a,b,true)然后这里是+1-性能并不重要。如果使用稍微少一点的字符串比较方法会导致性能问题,则需要重新考虑您的方法。Microsoft建议不要使用string.Compare()检查是否相等。有一个等效字符串.Equals()将处理空检查。我建议使用string.Equals(a,b,StringComparison.ordianignorecase);如果字符串可以为null,我希望出现
    NullReferenceException
    ,而不是错误的结果。因为你不能把什么都比不上什么。在
    null
    有意义的奇怪情况下,我会事先检查
    null
    并返回
    false
    ,而不是用一个比较函数替换它,该函数用于替换
    Equals
    ,混淆代码。这不会编译。你的意思是:
    String.Equals(a,b,StringComparison.OrdinalIgnoreCase.Equals)
    ?我不知道,我看了微软的文档,并没有真正发现
    OrdinalIgnoreCase
    实际上做了什么。我可以冒昧地猜测,它只升或降ASCII或拉丁文,但它仍然是一个猜测。
    if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )