-
21-08-2019 - |
题
有一定数量的方式比较串。有性能性别问题信息和联网系统,这样做的一种方法在另一个?
我总是选择了比较串像这样:
string name = "Bob Wazowski";
if (name.CompareTo("Jill Yearsley") == 0) {
// whatever...
}
但是我找到很少人这样做,并且如果有的话,我看到更多的人只是在做一个直==比较,而据我所知是最糟糕的方式比较串。我错了吗?
此外,它不会使一个差别在一个如何进行比较串在皇宫查询?例如,我想要做如下:
var results = from names in ctx.Names
where names.FirstName.CompareTo("Bob Wazowski") == 0
select names;
但是,再一次,我看到几个人做串比较喜欢这样在他们的皇宫的查询。
解决方案
根据反射
"Hello" == "World"
是相同的
String.Equals("Hello", "World");
这基本上确定它们是否相同的参考对象时,如果它们中的为空,这将是一个自动假如果为空,而另一个不是,然后在一个不安全的环每个字符进行比较。因此,它不关心文化规则可言,这通常不是一个大问题。
和
"Hello".CompareTo("World") == 0
是相同的
CultureInfo.CurrentCulture.CompareInfo.Compare("Hello", "World", CompareOptions.None);
这基本上是相反的,只要功能性。它考虑到文化,编码,以及其他一切与字符串中的上下文。
所以,我会想象的 String.CompareTo是一对夫妇幅度大于等于运算符
较慢的订单为您的LINQ不会,如果你正在使用LINQ到SQL,因为两者会产生相同的SQL关系
var results = from names in ctx.Names
where names.FirstName.CompareTo("Bob Wazowski") == 0
select names;
的
SELECT [name fields]
FROM [Names] AS [t0]
WHERE [t0].FirstName = @p0
所以你真的没有为LINQ到SQL赢得任何东西,除了难以阅读的代码和表达式的可能更多的解析。如果你只是使用LINQ为标准阵列东西然后规则我布置以上适用。
其他提示
在我看来,你应该总是用最清晰的方式,这是使用==
!
这可以直接理解为:当“你好”等于“世界”,然后做一些事情
。if ("Hello" == "World")
// ...
内部,String::Equals
被调用,其用于此目的明确地存在 - 比较两个字符串是否相等。 (这具有无关的指针和引用等)
这是这里尚不清楚 - 为什么比较为零
?if ("Hello".CompareTo("World") == 0)
.CompareTo不仅仅是检查平等(你==本)设计 - 它比较两个字符串。您可以使用.CompareTo在各种以来决定是一个字符串比另一“大”。您可以检查平等,因为它产生零等于字符串,但是这不是它的concepted了。
因此也有不同的方法和接口,用于检查平等(IEquatable,操作者==)和比较(IComparable的)
LINQ的不表现比常规C#这里不同。
阅读杰夫的 最好的代码是完全没有代码 。 foo.CompareTo(bar) == 0
:可怕的视觉混乱。占用了大量的空间,并没有传递有趣的含义。事实上,它强调了很多不相关的东西偏转注意力从真正的问题。
如果没有明确的原因,使用这种再变型中,不
至于性能:它根本没关系对于这个简单的例子。如果相等运算符==
真的应该比CompareTo
表现更差,随意提交与微软的bug报告。这必须没有发生。
好了MSDN指出你建议立即进行删除按照任务使用比较函数,你需要执行:
在CompareTo方法主要是设计用于排序或按字母顺序排列的操作。它不应该被使用时,方法调用的主要目的是确定两个字符串是否是等价的。为了确定两个字符串是否等效,调用Equals方法。
所以,如果它不是排序,我会说,你应该用的retrun值并不重要:
first.Equals(second)
或者如果比较是在语言文化具体例如像在德国:
String.Equals(first, second, StringComparison.CurrentCulture)
看一看一个这些链接:
有一个相当类似的问题,最近关于最快的方法来装饰一串,但它基本上是的基准不同的方式比较。
你可以检查出的基准 在这个职位.
有一个很好的文章平等在.NET比较值:身份和等价这是有点比仅字符串比较更一般的,但很有趣仍然
如果相等运算符实际上比CompareTo
表现糟糕? - 不会让微软的平等话务员呼叫CompareTo
实施
只需使用等于运算符来测试是否相等。
我一般使用String.Compare与采用一个StringComparison参数,因为然后我可以绝对明确的关于所述比较是否是区分和文化敏感的过载。这需要.NET 2.0或更高。
最快的是StringComparison.Ordinal(或StringComparison.OrdinalIgnoreCase如果不区分大小写)对于不是培养敏感比较。
使用==的问题是,目前还不清楚,提交人认为病例和文化敏感性。
有关于这个问题的一个很好的MSDN文章这里。
要最好的方式来比较的 string
强>的在C#是使用 a.Equals(b)
强>其中的一个和<强> B'/强>都是字符串。这是为了进行比较的字符串的最佳方式,因为它比较的对象的一个和<强> B'/强>的值,并且在对象上的引用不depent。
如果你要使用“==
” 符号,其结果将是平等的,如果两个对象具有相同的参考,但你将有一个问题,当他们有不同的引用,并具有相同的值
的 compareTo
方式是,如果使用最佳方式您的测试是否另一个串是之前,之后或出现在另一个字符串的同一位置,其中它会返回负值,正值或零分别价值。它会返回也正值如果该参数null
这里是最完整的的和有益的MSDN指南关于字符串比较我发现。
与StringComparison.Ordinal或使用比较 StringComparison.OrdinalIgnoreCase获得更好的性能。