簡體   English   中英

如何使用可比較的C#比較Generic中的字符串和整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM