我怎么能不声明一个类是什么类型的呢?
本文关键字:是什么 类型 一个 怎么能 声明 | 更新日期: 2023-09-27 18:11:26
我已经创建了一个类来实现数组上的快速排序算法。这是类的构造函数和变量:
public class QuickSort
{
int[] numbers;
public QuickSort(int[] input) {
numbers = input;
Console.WriteLine("QuickSort created!");
}
但是我想把它用于其他类型的数组,比如float。我如何声明类,以便它可以接受任何类型的数组作为输入?由于
这个问题比看起来要难。
首先,这里已经有两个答案说要使用泛型。
对于给定的代码示例,它们是100%正确的,使用泛型。
但仅凭这一点并不能给你如何继续下去的答案。
首先,使用泛型可以让你编写一个接受任何类型值的快速排序类或方法。
然而,当你的sort方法可以接受任何类型的值时,它不一定会告诉你如何实际进行排序。
下面是I如何声明问题中的内容:
public class Quicksort
{
public void Sort<T>(IList<T> collection)
where T : IComparable<T>
{
...
}
}
不发布快速排序方法的实际实现,好处是:
- 可以接受任何类型的值,如
T
- 提供
T
知道如何将自己与其他T
(where T : IComparable<T>
)进行比较,这意味着如果您对int进行排序,任何一个int都可以告诉您它是在任何其他int之前还是之后,或者与任何其他int相同。 - 使用
IList<T>
意味着你可以使用T
的任何可预索引类型的集合。快速排序通常依赖于能够知道集合中有多少元素要排序,IList<T>
是。net集合世界中可以这样做的最小类型(除非你可以使用IList
,非泛型接口)。
只有你知道答案的问题:
- 为什么把
numbers
作为QuickSort
的实例变量?为什么需要实例变量呢?可以使用泛型:
public class QuickSort<T>
{
T[] numbers;
public QuickSort(T[] input) {
numbers = input;
Console.WriteLine("QuickSort created!");
}
使用泛型:
public class QuickSort<T> where T : IComparable<T>
您必须使用IComparable<T>
接口而不是比较操作符来进行排序。
或只是:
public class QuickSort<T>
但是你必须在算法中使用IComparer<T>
。您可以使用以下命令获取类型T
的默认值:Comparer<T>.Default
无论哪种方式,标准比较运算符(<
, >
等)都不能用于泛型类型。