除了 .NET Framework 中的错误之外,还有其他解释吗? EqualityComparer<Uri>.Default.Equals()
方法是说以下网址是相等的!
http://books.google.com/books?id=B84KAQAAIAAJ&pg=PA29&lpg=PA29&dq=fletcher+sandford+tilton&source=bl&ots=ou8eF5REOG&sig=74fzA11Z8AENBtyCUcXEsXV06jQ&hl=en&ei=2rHTS9LaN4249gTOh_GrDw&sa=X&oi=book_result&ct=result&resnum=3&ved=0CA0Q6AEwAg#v=onepage&q=fletcher秒
和
http://books.google.com/books?id=B84KAQAAIAAJ&pg=PA29&lpg=PA29&dq=fletcher+sandford+tilton&source=bl&ots=ou8eF5REOG&sig=74fzA11Z8AENBtyCUcXEsXV06jQ&hl=en&ei=2rHTS9LaN4249gTOh_GrDw&sa=X&oi=book_result&ct=result&resnum=3&ved=0CA0Q6AEwAg#v=onepage&q=fletcher
注意第一个末尾的空格后跟“s”。
最佳答案
好吧,问题(无论对错)不在 EqualityComparer<Uri>.Default
.它调用 Uri.Equals()
正如它应该。
现在,Uri.Equals()
仅忽略片段的差异。在很多情况下这是合适的。在很多情况下并非如此。就我个人而言,我不会将它作为默认设置,但是由于我不是编码它的人,因此我可能不知道有什么令人信服的理由让事物保持现状。
请注意,这是记录在案的。
其他决定也是有争议的(它忽略主机组件上的大小写差异与许多关于 URI 的实际问题相匹配,但不是在某些规范中如何定义 URI 相等性)。
如果您需要比这更严格的平等,我建议您定义自己的比较器:
public class UriStictEqualityComparer : IEqualityComparer<Uri>
{
public bool Equals(Uri x, Uri y)
{
return ReferenceEquals(x, y)
||
(
x != null
&&
y != null
&&
x.IsAbsoluteUri == y.IsAbsoluteUri
&&
x.ToString() == y.ToString()
);
}
public int GetHashCode(Uri obj)
{
return obj == null ? 0 : obj.ToString().GetHashCode();
}
}
尽管如此,您可能会发现您希望上述某些情况下认为不相等的情况也相等。例如。需要考虑punycode和non-punycode版本是否相同,转义的非特殊字符是否应该转义等等。乌里的
Compare
在这种情况下,方法可能是有益的。
关于.net - EqualityComparer<Uri>.Default.Equals() 返回错误结果还是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8468930/