C# 使用IComparable接口比较int和long
我希望有比较两个对象并通过以下测试的表达式类C# 使用IComparable接口比较int和long,c#,icomparable,C#,Icomparable,我希望有比较两个对象并通过以下测试的表达式类 public abstract class ComparisonExpression { public bool Evaluate(IComparable left, object right) { if (left == null && right == null) return true; if (left == null || right == null)
public abstract class ComparisonExpression
{
public bool Evaluate(IComparable left, object right)
{
if (left == null && right == null)
return true;
if (left == null || right == null)
return false;
return GetResult(left.CompareTo(right));
}
protected abstract bool GetResult(int comparisonResult);
}
public class AreEqualExpression : ComparisonExpression
{
protected override bool GetResult(int comparisonResult)
{
return comparisonResult == 0;
}
}
// TEST
const int i = 123;
const long l = 123L;
const string s = "123";
Assert.IsTrue(new AreEqualExpression().Evaluate(i, l));
Assert.IsFalse(new AreEqualExpression().Evaluate(i, s));
Assert.IsFalse(new AreEqualExpression().Evaluate(l, s));
IComparable实现似乎希望给定类型与当前类型匹配。我遇到了一个异常,比如对象必须是Int32类型
我认为如果类型不相等,则返回false。它阻止了异常,但阻止了我想要的行为
我还考虑过类型转换,但这次字符串和int比较将返回true,这是我不想要的
有什么建议吗?如果您定义此帮助器类
public static class NumericalHelper {
public static double AsDouble(this object value, out bool success) {
if (value is sbyte || value is byte || value is short || value is ushort || value is int || value is uint || value is long || value is decimal || value is ulong || value is float || value is double || value.GetType().IsEnum) {
success = true;
return Convert.ToDouble(value);
}
success = false;
return 0;
}
}
您可以这样进行比较:
public bool Evaluate(IComparable left, object right) {
if (left == null && right == null)
return true;
if (left == null || right == null)
return false;
bool isNumerical;
double leftValue = left.AsDouble(out isNumerical);
double rightValue = isNumerical ? right.AsDouble(out isNumerical) : 0;
if (isNumerical)
return GetResult(Comparer<Double>.Default.Compare(leftValue, rightValue));
else {
if (left.GetType() == right.GetType())
return GetResult(left.CompareTo(right));
else
return false;
}
但请注意,等式通常与Equals方法或IEquatable接口进行比较,而在您的示例中根本没有考虑到这一点。这对我来说似乎是一个问题,它不适合当前的类设计。只是为了检查我是否理解正确:您希望比较器像往常一样进行比较,除非两种类型都是数字。在这种情况下,您希望比较器检查这些数字是否具有相同的值。如果这正是您所要求的:这是否仅适用于整数类型byte,short。。。还是小数和浮点数?不,这应该处理实现IComparable的任何类型。我的解决方案是在比较之前检查两个值是否都是数字。如果是这样,那么我将这两个值转换为十进制,然后进行比较。但对于双人和浮动车来说,这仍然是一辆马车。这就是我所理解的。所以,粗略地说,你的算法应该做到以下几点?a如果两者都是浮点数,则双击->使用浮点数进行比较b如果两者都是整数值short、int、long、…->比较整数值c,否则按常规进行比较。对吗?