比较自定义类型

时间:2012-01-30 02:11:16

标签: c#

我在C#中实现了一个通用的PriorityQueue作为家庭作业的一部分。 这些项目存储在一个数组中。

class PQueue<T> : IPQueue<T>
{
    T[] items;
    //..
}

如何比较两个项目。我想PQueue实例化的类型必须实现IComparable / IComparer。如果是这样,我如何比较items中的两个元素?

设计这个的优雅方式是什么。

3 个答案:

答案 0 :(得分:3)

首先,您需要告诉C#<T>实现IComparable<T>

class PQueue<T> : IPQueue<T> where T : IComparable<T> {
    T[] items;
    //..
}

现在您可以比较单个项目,如下所示:

var cmp = items[i].CompareTo(items[j]);
if (cmp < 0) {
    // items[i] is less than items[j]
} else if (cmp > 0) {
    // items[i] is greater than items[j]
} else {
    // Items are equal
}

答案 1 :(得分:1)

您可能正在寻找generic constraints,可让您指定T必须实施IComparable

class PQueue<T> : IPQueue<T> where T : IComparable<T>
{
    // ...
}

答案 2 :(得分:0)

首先,您的自定义类型(T)必须具有排序顺序

T是内置数字类型,如int,double等,具有“自然”排序顺序;或者您必须将其定义/编码到您的自定义类中。

也许有一些类属性或属性组合是可用于确定自定义类的排序顺序的内置类型之一。

字母字符具有“自然”排序顺序。请记住上层和下面的排序顺序。给定字母的小写字母不是连续的。当涉及字符串时,如果大写/小写不是必需的(为了排序目的)在比较之前将字符串转换为较低(或较高,并不重要)。

您编写的任何枚举都有排序顺序,因为它们基本上是整数。

CompareTo()定义自定义类的排序顺序

This method是“橡胶符合道路”的grunt代码,用于决定被比较的两个对象的顺序。 如何运作是你必须解决的问题。

关于您的IPQueues类

作为内部集合的数组似乎不是一个好主意,因为数组大小是固定的。 .NET有一个Queue class;这对你有用吗?