使用IComparable接口比较int和long

时间:2013-03-28 06:28:30

标签: 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)
            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,这是我不想要的。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果您定义此助手类

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接口进行通用比较,在您的示例中根本没有考虑到这一点。 Here is more information about implementing equality。这对我来说似乎是一个问题,这在使用当前的类设计时并不合适。