我想比较两个不区分大小写的叮咬,但我不确定最好的方法。这些字符串的平均长度为20,这个问题更多的是关于最新技术而不是最佳性能
我的大多数代码都使用
bool output = "foo".ToLower() == "FOO".ToLower();
对我来说似乎有点过时了。我多次见过的另一种方式是
bool output = Regex.IsMatch("foo", "FOO", RegexOptions.IgnoreCase);
我想这是可能的,但RegEx不是为了这么简单的事情。
之后3"好"方式留下:
bool output = string.Compare("foo", "FOO", StringComparison.CurrentCultureIgnoreCase) == 0;
bool output = string.Compare("foo", "FOO", true) == 0;
bool output = "foo".Equals("FOO", StringComparison.CurrentCultureIgnoreCase);
答案 0 :(得分:4)
如果你看一下相应的参考资料
https://referencesource.microsoft.com/#mscorlib/system/string.cs,bda3b2c94b5251ce
public static int Compare(String strA, String strB, bool ignoreCase)
{
if (ignoreCase) {
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
}
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);
}
https://referencesource.microsoft.com/#mscorlib/system/string.cs,0be9474bc8e160b6
public static int Compare(String strA, String strB, StringComparison comparisonType)
{
...
// Agrument validation, reference equality, null test
switch (comparisonType) {
...
case StringComparison.CurrentCultureIgnoreCase:
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
https://referencesource.microsoft.com/#mscorlib/system/string.cs,d47c1f57ad1e1e6e
public static bool Equals(String a, String b, StringComparison comparisonType) {
...
// Agrument validation, reference equality, null test
switch (comparisonType) {
...
case StringComparison.CurrentCultureIgnoreCase:
return (CultureInfo.CurrentCulture.CompareInfo.Compare(a, b, CompareOptions.None) == 0);
你会发现这三种方法相互相等。至于其他方式,Regex.IsMatch
肯定是 overhoot (你要做的就是比较字符串);处理特定文化字母时,ToLower()
可能会很棘手,请参阅
https://en.wikipedia.org/wiki/Dotted_and_dotless_I
这就是为什么一个更好的设计是明确地宣告你的意图 (=我想要比较字符串)然后掩盖它们(并让系统解雇你)
答案 1 :(得分:1)
如果您要检查是否相等,请使用Equals
。使用Compare
等同于使用
if (collection.Count() == 0)
而不是
if (collection.Any())
在LINQ中。即使这两者目前可以实施并且表现相似,但您仍然掩盖了您的意图,并且您未来也没有保证。
答案 2 :(得分:-1)
我认为这很好
bool output = Regex.IsMatch("foo", "FOO", RegexOptions.IgnoreCase);