必须实现一个小于和大于一般的操作

时间:2010-03-01 16:46:59

标签: c# generics

我绝对不能硬编码数据类型。我需要严格的数据输入。我必须使用TValue a< = TValue b。再一次,绝对没有办法去做(双)a。这是基本库实现的一部分。关于泛型值的唯一具体事情是它们是静态类型。 IComparable和其他接口似乎不起作用。

3 个答案:

答案 0 :(得分:40)

为什么IComparable不能为您服务?

您可能无法获得使用“<”的语法糖和“>”符号,但您可以检查CompareTo的结果是否小于或大于0,这将为您提供相同的信息。

你甚至可以编写一个很好的扩展方法,以便更容易使用。

static void Main(string[] args)
{
    Console.WriteLine(1.IsGreaterThan(2));
    Console.WriteLine(1.IsLessThan(2));
}

public static bool IsGreaterThan<T>(this T value, T other) where T : IComparable
{
    return value.CompareTo(other) > 0;
}

public static bool IsLessThan<T>(this T value, T other) where T : IComparable
{
    return value.CompareTo(other) < 0;
}

答案 1 :(得分:16)

只需使用System.Collections.Generic.Comparer<T>.Default.Compare(x,y) - 并查找负值,正值和0返回值。

这支持IComparable<T>IComparable,适用于类,结构和Nullable<T> - 结构。

答案 2 :(得分:4)

您可以更准确地了解您的数据类型和用例吗?

毕竟,要实现比较操作,您需要有关该类的某些信息;一个完全通用的实现通常不具备比较两个对象所需的信息 - 除非你想在GetHashCode()或ToString()上对它们进行排序,这是一件很奇怪的事情。

有各种用于类型安全比较的通用接口:

如果您已在类型上实施IComparableIComparable<T>,那么您可以使用Comparer<T>.Default自动获取后一种变体 - 这会使比较消费者的写入时间缩短一些,并且是一个通用约束的替代方法,要求类型为IComparable<T>