C#中的字符串比较性能

Jag*_*agd 20 .net c# linq performance string-comparison

有许多方法可以比较字符串.通过一种方式比另一种方式获得性能提升吗?

我总是选择像这样比较字符串:

string name = "Bob Wazowski";
if (name.CompareTo("Jill Yearsley") == 0) {
    // whatever...
}
Run Code Online (Sandbox Code Playgroud)

但我发现很少有人这样做,如果有的话,我看到更多的人只是做一个直接的==比较,据我所知,这是比较字符串的最差方式.我错了吗?

另外,它是如何比较LINQ查询中的字符串的?例如,我喜欢做以下事情:

var results = from names in ctx.Names
              where names.FirstName.CompareTo("Bob Wazowski") == 0
              select names;
Run Code Online (Sandbox Code Playgroud)

但同样,我看到很少有人在他们的LINQ查询中进行字符串比较.

Nic*_*rdi 25

根据Reflector

"Hello" == "World"
Run Code Online (Sandbox Code Playgroud)

是相同的

String.Equals("Hello", "World");
Run Code Online (Sandbox Code Playgroud)

它基本上确定它们是否是同一个引用对象,如果它们中的任何一个为null,如果一个为null而另一个为null则为自动false,然后比较不安全循环中的每个字符.所以它根本不关心文化规则,这通常不是什么大问题.

"Hello".CompareTo("World") == 0
Run Code Online (Sandbox Code Playgroud)

是相同的

CultureInfo.CurrentCulture.CompareInfo.Compare("Hello", "World", CompareOptions.None);
Run Code Online (Sandbox Code Playgroud)

就功能而言,这基本上是相反的.它考虑了文化,编码以及字符串在上下文中的所有其他内容.

所以我想象String.CompareTo比相等运算符慢几个数量级.

对于LINQ而言,如果使用LINQ-to-SQL并不重要,因为两者都会生成相同的SQL

var results = from names in ctx.Names
          where names.FirstName.CompareTo("Bob Wazowski") == 0
          select names;
Run Code Online (Sandbox Code Playgroud)

SELECT [name fields]
FROM [Names] AS [t0]
WHERE [t0].FirstName = @p0
Run Code Online (Sandbox Code Playgroud)

所以你真的没有为LINQ-to-SQL获得任何东西,除了更难以阅读代码和可能更多的表达式解析.如果你只是使用LINQ作为标准数组的东西,那么我上面列出的规则就适用了.

  • string.Equals在.NET 4.0中没有进行引用相等性检查,它在字符串中重载以比较实际的字符串.(如果这总是如此,我不会感到惊讶.) (2认同)

Dar*_*rio 16

在我看来,你应该总是使用最清晰的方式,即使用==!

这可以直接理解:当"你好"等于"世界"然后做一些事情.

if ("Hello" == "World")
    // ...
Run Code Online (Sandbox Code Playgroud)

在内部,String::Equals调用显式存在于此目的 - 比较两个字符串是否相等.(这与指针和引用等无关)

这里不是立即清楚 - 为什么比较为零?

if ("Hello".CompareTo("World") == 0)
Run Code Online (Sandbox Code Playgroud)

.CompareTo不仅仅用于检查相等性(你有==) - 它比较两个字符串.您可以使用.CompareTo来确定一个字符串比另一个字符串"更大".您可以检查是否相等,因为它对于相等的字符串产生零,但这不是它的概念.

因此,有不同的方法和接口用于检查相等性(IEquatable,operator ==)和比较(IComparable)

Linq与普通C#的行为不同.

  • OP没有询问编写字符串比较的最清晰的方法.对一个人来说清楚的是另一个人可能不清楚. (3认同)

Kon*_*lph 8

阅读杰夫的最佳代码完全没有代码.foo.CompareTo(bar) == 0:可怕的视觉混乱.占用大量空间并没有传达任何有趣的意义.事实上,它强调了很多无关紧要的东西,这些东西会把注意力从真正的问题上转移开来.

如果使用这个较长的变体没有明确的原因,请不要.

至于性能:对于这个简单的情况,它无关紧要.如果相等运算符==确实应该执行得更差CompareTo,请随时向Microsoft提交错误报告.这绝不可能发生.


Clo*_*ble 5

那么 MSDN 声明你应该根据你需要执行的任务使用比较功能:

CompareTo 方法主要设计用于排序或按字母顺序排列的操作。当方法调用的主要目的是确定两个字符串是否相等时,不应使用它。若要确定两个字符串是否等效,请调用 Equals 方法。

因此,如果它不是关于排序并且重运行值不重要,我会说应该使用:

first.Equals(second) 或者如果比较是特定于文化的,例如在德语等语言中:

String.Equals(first, second, StringComparison.CurrentCulture)

看看这些链接:

如何:比较字符串(C# 编程指南)

String.CompareTo 方法(对象)