C#中字符串类型的最快(内置)比较是什么

Wil*_*sem 32 c# string performance

C#中字符串类型最快的内置比较方法是什么?我不介意印刷/语义含义:目的是在排序列表中使用比较器,以便在大型集合中快速搜索.我认为只有两种方法:CompareCompareOrdinal.什么是最快的?

另外,这些字符串比较是否有更快的方法?

Jon*_*eet 57

我假设你想要一个小于/等于/大于比较而不仅仅是平等; 平等是一个略有不同的主题,虽然原则基本相同.如果你实际上只寻找存在的东西就像一个SortedList,我会考虑使用Dictionary<string, XXX>,而不是-你真的需要所有的排序?

String.CompareOrdinal,或使用其重载String.Compare允许提供比较,并指定序数(区分大小写)比较,例如String.Compare(x, y, StringComparison.Ordinal)将是最快的.

基本上,有序比较只需逐个字符地走两个字符串,直到找到差异为止.如果没有发现任何差异,并且长度相同,则结果为0.如果没有发现任何差异但长度不同,则较长的字符串被视为"较大".如果确实找到了差异,它可以立即解决,根据顺序术语中哪个字符"更大",这被认为是"更大".

放置是另一种方式:它就像在两个char[]值之间进行明显的比较.

文化敏感的比较必须根据您使用的精确文化执行各种曲折的壮举.有关此示例,请参阅此问题.很明显,遵循更复杂的规则会使速度变慢.


Pet*_*son 11

我刚刚注意到我自己的代码性能提高了50%,首先比较字符串长度,如果相等,那么使用string.compare方法.所以在循环中我有:

VB:

If strA.length = strB.length then
   if string.compare(strA,strB,true) = 0 then
      TheyAreEqual
   End if
End if
Run Code Online (Sandbox Code Playgroud)

C#:

if(strA.Length == strB.Length)
{
   if(string.Compare(strA,strB,true) == 0)
   {
       //they are equal
   }
}
Run Code Online (Sandbox Code Playgroud)

这可能取决于你自己的字符串,但它似乎对我有用.


Sam*_*ell 5

最快的是带有引用相等性测试的实习字符串,但是您只能进行相等性测试,并且会消耗大量内存 - 如此昂贵,以至于几乎从来都不是推荐的课程

除此之外,区分大小写的序数测试将是最快的,对于非区域性特定的字符串绝对推荐使用此方法。如果适用于您的用例,区分大小写会更快。

当您指定 或StringComparison.OrdinalStringComparison.OrdinalIgnoreCase,字符串比较将是非语言的。也就是说,在做出比较决策时,会忽略自然语言特有的特征。这意味着决策基于简单的字节比较,并忽略按区域性参数化的大小写或等价表。因此,通过显式地将参数设置为 或StringComparison.OrdinalStringComparison.OrdinalIgnoreCase您的代码通常会提高速度、提高正确性并变得更加可靠。

来源