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作为标准数组的东西,那么我上面列出的规则就适用了.
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#的行为不同.
阅读杰夫的最佳代码完全没有代码.foo.CompareTo(bar) == 0
:可怕的视觉混乱.占用大量空间并没有传达任何有趣的意义.事实上,它强调了很多无关紧要的东西,这些东西会把注意力从真正的问题上转移开来.
如果使用这个较长的变体没有明确的原因,请不要.
至于性能:对于这个简单的情况,它无关紧要.如果相等运算符==
确实应该执行得更差CompareTo
,请随时向Microsoft提交错误报告.这绝不可能发生.
那么 MSDN 声明你应该根据你需要执行的任务使用比较功能:
CompareTo 方法主要设计用于排序或按字母顺序排列的操作。当方法调用的主要目的是确定两个字符串是否相等时,不应使用它。若要确定两个字符串是否等效,请调用 Equals 方法。
因此,如果它不是关于排序并且重运行值不重要,我会说应该使用:
first.Equals(second)
或者如果比较是特定于文化的,例如在德语等语言中:
String.Equals(first, second, StringComparison.CurrentCulture)
看看这些链接: