![](/img/trans.png)
[英]How to create a generic method in C# that's all applicable to many types - ints, strings, doubles etc
[英]How to compare Strings & ints in Generic Using comparable C#
我曾試圖使用IComparable和研究但我無法弄清楚為什么這不起作用。 我想比較字符串和整數但我不明白如何使用ICompareable接口在一種Generic上做compareTo。
如何實現CompareTo來處理泛型?
public class QuickSort : IComparable
{
public static int Partition<T>(ref T[] arr, int lo, int hi)
{
int i = lo + 1;
int j = hi;
while (j > i)
{
while (arr[i].) // <- Cannot apply CompareTo
i++;
while (arr[j] > arr[lo])
j--;
Swap(ref arr[i], ref arr[j]);
}
Swap(ref arr[lo], ref arr[j]);
return j;
}
}
您必須指定可以比較T
,編譯器無法知道該類型的預期。 這樣您就可以將CompareTo
用於以下兩種情況:
public class QuickSort
{
public static int Partition<T>(T[] arr, int lo, int hi) where T : IComparable
{
int i = lo + 1;
int j = hi;
while (j > i)
{
while (arr[i].CompareTo(arr[lo]) == 0)
i++;
while (arr[j].CompareTo(arr[lo]) > 0) // means arr[j] > arr[lo]
j--;
Swap(ref arr[i], ref arr[j]);
}
Swap(ref arr[lo], ref arr[j]);
return j;
}
}
另外,我認為你不想比較不同的QuickSort
實例,所以我刪除了它的界面。
更新:根據Hawkmooon的評論,我再看看你的方法,並認為它的簽名可以更簡單:
public static int Partition(IComparable[] arr, int lo, int hi)
{
int i = lo + 1;
int j = hi;
while (j > i)
{
while (arr[i].CompareTo(arr[lo]) == 0)
i++;
while (arr[j].CompareTo(arr[lo]) > 0)
j--;
Swap(ref arr[i], ref arr[j]);
}
Swap(ref arr[lo], ref arr[j]);
return j;
}
我認為你的代碼可能遺漏了一些東西。 以防萬一, 在這里你有一個完整的C#示例工作快速排序方法 。
您需要明確指定您的T
實現IComparable
。 將方法的聲明更改為:
public static int Partition<T>(ref T[] arr, int lo, int hi) where T : IComparable
你也無法比較你的項目,如arr[i] > arr[j]
。 你需要調用CompareTo()
並檢查它是否CompareTo()
零,小於零或等於零:
while(arr[i].CompareTo(arr[high]) > 0)
(這意味着arr[i] > arr[high]
在你的情況下。)
而且很可能您不需要在QuickSort
類上實現IComparable
。 需要對那些將要比較的項目實施IComparable
,而不是比較器類本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.