[英]C# compare two objects of unknown types (including reference and value types)
在C#中是否可以使用类型比较器(如果它们存在)比较两个未知类型的对象(包括引用和值类型)?
目标是编写一个具有如下签名的函数:
public bool Compare(object a, object b)
{
// compare logic goes here
}
哪会回来
Compare(100d, 100d) == true
Compare(100f, 100f) == true
Compare("hello", "hello") == true
Compare(null, null) == true
Compare(100d, 101d) == false
Compare(100f, null) == false
// Use type comparators where possible, i.e.:
Compare(new DateTime(2010, 12, 01), new DateTime(2010, 12, 01)) == true
Compare(new DateTime(2010, 12, 01), new DateTime(2010, 12, 02)) == false
Compare(new DateTime(2010, 12, 01), null) == false
有没有一种通用的方法来解决这个问题,适用于任何类型的对象?
您可以使用静态object.Equals(object x, object y)
方法,而不必费心编写您的方法。 这将适当地处理空值,并委托object.Equals(object)
x
或y
关联的object.Equals(object)
的实现...它应该无关紧要,因为Equals
是对称的。
请注意,这不会对任何类型使用==运算符 - 运算符不能被重写,只能重载(这意味着它们是在编译时选择的,而不是执行时 。在大多数情况下, Equals
应该做你想要的在某些情况下,即使Equals
被覆盖,==也可能不会超载......但我从来不知道在我使用的任何类型中反之亦然。
请注意,使用此方法将包装任何值类型...
编辑:删除了有效重新实现的部分 - 很差 - EqualityComparer<T>.Default
。 请参阅Marc的答案。 如果你不能使用通用类型,这对你没有帮助。
最后一点:我不会把你的方法叫做Compare
。 该名称通常与排序值相关联,而不是将它们进行相等性比较。
一个合理的选择是使用泛型,即
public bool Compare<T>(T a, T b) {...}
您不需要在代码中指定T
,因为编译器通常能够解决它(即您现有的样本将“按原样”工作)
为实施:
bool equal = EqualityComparer<T>.Default.Equals(x, y);
(对于通用类型T
)
但实际上我会避免使用Compare
字,因为在其他地方使用的是<
/ ==
/ >
- 所以我可能会:
public static bool Equals<T>(T a, T b) {
return EqualityComparer<T>.Default.Equals(a, b);
}
这个:
Nullable<T>
IEquatable<T>
Equals
它不使用==
操作符,但MiscUtil有一个Operator
类, 将通过
bool equal = Operator.Equal<T>(x,y);
(注意如果T
没有==
运算符,后者将失败,虽然考虑到它,它可以使用EqualityComparer<T>.Default.Equals
作为后备;它只是没有)
为了完整Comparer<T>.Default.Compare(x,y)
,请注意Comparer<T>.Default.Compare(x,y)
处理比较操作。
object.equals(x, y)
怎么样? 这也将接受空值。
关于什么
if (a == null && b == null) return true;
if (a == null && b != null) return false;
return (a.equals(b));
?
我不是100%确定这是否适用于所有情况,但试一试
public bool Compare(object a, object b) { return a.Equals(b); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.