我怎么能不声明一个类是什么类型的呢?

本文关键字:是什么 类型 一个 怎么能 声明 | 更新日期: 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

无论哪种方式,标准比较运算符(<, >等)都不能用于泛型类型。