IComparable IgnoreCase

时间:2012-05-22 19:09:45

标签: c# icomparable

我正在编写一个函数来比较IComparable类型的2个值,如果不相等则抛出。基本上,重新制作断言。是的,我知道我正在重新发明轮子。

    public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T>
    {
        if (0 != Value1.CompareTo(Value2))
        {
            throw new ApplicationException("Fail");
        }
    }

除了字符串以外工作正常,我希望忽略大小写的选项。 “AA”vs“aa”

当T是String时,我想特别重写此方法,所以我可以使用String.Compare并忽略大小写。拥有另一个参数也很酷,因此用户可以指定是否应该忽略字符串(但是,这对于像int这样的其他类型来说是无用的,所以看起来有点像混乱/糟糕的设计。我愿意接受这里的建议)。

这样做有好办法吗?我也愿意改变到与IComparable不同的类型,最初认为这是工作的最佳界面,但现在意识到我可能错了。

where T : IComparable<T>

2 个答案:

答案 0 :(得分:2)

你可以创建另一个函数,特别是对于字符串。

public static void IsEqual(string value1, string value2) 
{
  if (string.Compare(value1, value2, true) != 0)
    throw new ApplicationException("Fail for strings");
}

然后,如果你要调用IsEqual(1, 1),你的泛型重载将被调用,但如果你调用IsEqual("A", "a"),则会调用字符串重载。然后,如果需要,您可以简单地为字符串重载添加另一个可选参数。

答案 1 :(得分:1)

您可以尝试:

public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T>
    {
        if (typeof(T) == typeof(String))
        {
            if (String.Compare(Value1.ToString(), Value2.ToString(), true) != 0)
            {
                throw new ApplicationException("Fail");
            }
        }
        else if (0 != Value1.CompareTo(Value2))
        {
            throw new ApplicationException("Fail");
        }
    }