【问题标题】:IComparable IgnoreCaseIComparable IgnoreCase
【发布时间】:2012-05-22 19:09:44
【问题描述】:

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

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

除了字符串之外工作正常,我希望可以选择忽略大小写。 “AA”与“aa”

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

有什么好办法吗?我也愿意更改为与 IComparable 不同的类型,最初认为这是最适合这项工作的界面,但现在意识到我可能错了。

where T : IComparable<T>

【问题讨论】:

  • 通过测试 T 的类型来简单地处理字符串大小写对您来说不可行吗?类似 if(typeof(T)==string) String.Compare(...)
  • 是的,这就是我要找的。没有意识到类型比较是如何完成的。谢谢!

标签: c# icomparable


【解决方案1】:

您可以创建另一个函数,专门用于字符串。

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"),字符串重载将被调用。然后,如果需要,您可以简单地为字符串重载添加另一个可选参数。

【讨论】:

    【解决方案2】:

    你可以试试:

    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");
            }
        }
    

    【讨论】:

    • 这很好用 - 不知道可以获取泛型的类型。谢谢!
    • 不客气!可以使用反射,如果您想了解更多信息,请查看this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多