2014-07-04 43 views
0

我創建了一個類來實現上array.This快速排序算法是構造函數和類的變量:我怎麼能不聲明一下類型的類C#

public class QuickSort 
{ 
    int[] numbers; 

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

但我想將其用於其他類型的數組,如float。 我該如何聲明這個類,以便它可以將任何類型的數組作爲輸入? 感謝

+3

你看過泛型嗎? http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx –

回答

3

這個問題比它似乎更加困難。

首先,這裏已經有兩個答案使用泛型。

對於給定的代碼示例,它們100%正確,使用泛型。

但是,這並不會給你如何繼續的答案。

首先,使用泛型將使您能夠編寫可接受任何類型值的快速排序類或方法。

但是,它不一定會告訴您如何實際進行排序,當您的排序方法可以採取任何類型的值。

這裏的怎麼會從你的問題申報的東西:

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

沒有發佈實際執行的快速排序法,好處是:

  • 可以接受任何類型的值,如T
  • 提供T知道如何比較itse如果是其他的T的(where T : IComparable<T>),這意味着如果你正在對int進行排序,任何一個int都可以告訴你它是在它之前還是之後,或者與其他任何int相同。
  • IList<T>表示您可以採取T的任何預先索引類型的集合。快速排序通常依賴於能夠知道要排序的集合中有多少元素,而IList<T>是排序中最小的類型。NET收集世界,可以這樣做(除非你發誓IList,非通用接口)。

問題只有您知道答案:

  • 你爲什麼要把numbersQuickSort實例變量?爲什麼你需要實例變量?
+0

優秀的答案! –

+0

實例變量不是必須的,你是對的。我會用你的解決方案失效,我希望我能做我想做的事。謝謝你的時間 – loukaspd

0

使用泛型:

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

你將不得不使用IComparable<T>接口,而不是比較操作爲您的排序。

或者只是:

public class QuickSort<T> 

但那麼你就必須在算法中使用的IComparer<T>。你可以得到默認的一個類型TComparer<T>.Default

無論哪種方式,標準比較操作符(<>等)將不會與通用型工作。

+1

你應該把'where T:IComparable'改成'where T:IComparable '。自.NET 2(2005)以來,不需要使用非通用的IComparable接口。 –

+0

是的,這就是我的意思,但我忘了'',謝謝指出 –

0

您可以使用泛型:

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

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