【发布时间】:2018-10-04 13:35:57
【问题描述】:
在这个玩具代码中:
void Main()
{
var x = new string[] {"abc", "DEF"};
var y = new string[] {"ABC", "def"};
var c = new CompareCI();
var z = x.Except(y, c);
foreach (var s in z) Console.WriteLine(s);
}
private class CompareCI : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return string.Equals(x, y, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(string obj)
{
return obj.GetHashCode();
}
}
Except 方法似乎忽略了我的客户比较器。我得到了这些结果:
abc
DEF
这似乎没有被忽略。此外,当我在调试下运行它并在客户比较器中对 string.Equals 的调用放置一个断点时,断点从未命中,尽管代码运行并且我得到了我发布的结果。我期望没有结果,因为如果忽略大小写,序列是相等的。
我猜我做错了什么,但我需要第二双眼睛才能发现它。
【问题讨论】:
-
不需要自定义比较器......试试
var z = x.Except(y, StringComparer.OrdinalIgnoreCase); -
@RuiJarimba 不知道我是怎么错过的!谢谢!
-
啊,我以为这只是一个例子。但如果它真的只是一个不区分大小写的字符串比较,那么是的,直接在
Except调用中使用StringComparison.OrdinalIgnoreCase,因为它已经是一个IEqualtiyComparer<string>。