正在比较自定义类型

本文关键字:类型 自定义 比较 | 更新日期: 2023-09-27 18:21:45

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

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

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

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

正在比较自定义类型

首先,您需要告诉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
}

您可能正在寻找允许您指定T必须实现IComparable:的通用约束

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

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

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

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

字母表字符具有"自然"排序顺序。请记住,upper&给定字母的小写不是连续的。当涉及到字符串时,如果大写/小写不是必需的(出于排序目的),则在比较之前将字符串转换为小写(或大写,这并不重要)。

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

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

这种方法是"橡胶遇路"的咕哝代码,它决定了被比较的两个对象的顺序它是如何工作的是你必须弄清楚的。

关于您的IPQueues类

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