我怎么能不声明什么类型的类C#

时间:2014-07-04 21:27:45

标签: c# class input types constructor

我创建了一个类来在数组上实现QuickSort算法。这是类的构造函数和变量:

public class QuickSort
{
    int[] numbers;

    public QuickSort(int[] input) {
        numbers = input;
        Console.WriteLine("QuickSort created!");
    }

但是我想将它用于其他类型的数组,比如float。 如何声明该类,以便它可以将任何类型的数组作为输入? 感谢

3 个答案:

答案 0 :(得分:3)

这个问题比看起来更难。

首先,这里已经有两个答案说使用泛型。

对于给定的代码示例,它们是100%正确的,使用泛型。

但仅凭这一点并不能解释如何继续下去。

首先,使用泛型将使您能够编写将接受任何类型值的快速排序类或方法。

但是,当排序方法可以采用任何类型的值时,它不一定会告诉您如何实际排序。

以下是 I 如何从您的问题中声明内容:

public class Quicksort
{
    public void Sort<T>(IList<T> collection)
        where T : IComparable<T>
    {
        ...
    }
}

如果不发布quicksort方法的实际实现,那么好处将是:

  • 可以接受任何类型的值,如T
  • 已提供 T知道如何将自己与其他Twhere T : IComparable<T>)进行比较,这意味着如果您要对int进行排序,那么任何一个int可以告诉你它是在之前或之后,还是与任何其他int相同。
  • 使用IList<T>表示您可以采用T的任何可预索引类型的集合。 Quicksort通常依赖于能够知道集合中要排序的元素数量,而IList<T>是.NET集合世界中可以这样做的最小类型(除非你使用IList非-generic interface)。

问题只有你知道答案:

  • 为什么要numbersQuickSort实例变量?为什么你需要实例变量?

答案 1 :(得分:0)

使用泛型:

public class QuickSort<T> where T : IComparable<T>

您必须使用IComparable<T>界面而不是比较运算符进行排序。

或者只是:

public class QuickSort<T>

但是你必须在算法中使用IComparer<T>。您可以使用T

获取Comparer<T>.Default类型的默认值

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

答案 2 :(得分:0)

您可以使用泛型:

public class QuickSort<T>
{
  T[] numbers;

  public QuickSort(T[] input) {
    numbers = input;
    Console.WriteLine("QuickSort created!");
}