比较通用方法中的两个值c#

时间:2014-08-22 14:26:14

标签: c# generics comparison operators operands

我认为我的代码可以自我解释我想要实现的目标:

private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    {
        switch (operand.ToLower())
        {
            case "=":
                return operatorOne.Equals(operatorTwo);
            case "<":
                return operatorOne < operatorTwo;
            case ">":
                return operatorOne > operatorTwo;
            case "contains":
                return operatorOne.ToString().Contains(operatorTwo.ToString());
            default:
                return false;
        }
    }

它给了我错误:

Error   16  Operator '>','<' cannot be applied to operands of type 'T' and 'T'

我需要一个可以比较字符串,Int,Double,chars的方法。 注意:排除将为&gt;传递字符串的条件或者&lt;检查OR Int将被发送给&#34;包含&#34;检查

1 个答案:

答案 0 :(得分:9)

您可以使用Comparer<T>.Default.Compare(operatorOne, operatorTwo)进行比较。请注意,如果T未实现IComparableIComparable<T>,则Comparer<T>.Default.Compare会抛出异常。

要确保T实施IComparable,您可以添加where T: IComparable约束。 (它将排除实现IComparable<T>但不是 IComparable的类。仍然可以接受,因为许多实现IComparable<T>的类实现IComparable太。)

private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    where T: IComparable
{
    switch(operand.ToLower())
    {
        case "=":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) == 0;
        case "<":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) < 0;
        case ">":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) > 0;
        case "contains":
            return operatorOne.ToString().Contains(operatorTwo.ToString());
        default:
            return false;
    }
}

<强> P.S。

建议 Servy ,您也可以将IComparer作为额外参数传递给该函数。它将允许涵盖既不实现IComparable也不IComparable<T>的类型,因此Comparer<T>.Default对它们不起作用。

此外,积分会转到 @TimothyShields ,他建议Comparer<T>.Default