C# 如何比较字符串&;使用可比C的泛型ints#

C# 如何比较字符串&;使用可比C的泛型ints#,c#,generics,compareto,C#,Generics,Compareto,我曾尝试使用IComparable并进行了研究,但我不明白为什么这样做行不通。 我想比较字符串和整数,但我不知道如何使用IComparable接口对一种泛型进行比较 如何实现CompareTo来处理泛型 public class QuickSort : IComparable { public static int Partition<T>(ref T[] arr, int lo, int hi) { int i = lo + 1; i

我曾尝试使用IComparable并进行了研究,但我不明白为什么这样做行不通。 我想比较字符串和整数,但我不知道如何使用IComparable接口对一种泛型进行比较

如何实现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;

        }
}
公共类快速排序:IComparable
{
公共静态整型分区(参考T[]arr,整型lo,整型hi)
{
int i=lo+1;
int j=hi;
而(j>i)
{
while(arr[i]//arr[lo])
j--;
掉期(参考arr[i],参考arr[j]);
}
交换(参考arr[lo],参考arr[j]);
返回j;
}
}

您需要明确指定您的
T
实现
IComparable
。将方法的声明更改为如下所示:

public static int Partition<T>(ref T[] arr, int lo, int hi) where T : IComparable
(这意味着在您的情况下,
arr[i]>arr[high]


而且很可能不需要在
快速排序
类上实现
IComparable
IComparable
需要为那些要比较的项实现,而不是为comparator类本身实现。

您必须指定
T
可以比较,否则编译器无法知道预期的类型。通过这种方式,您可以对以下两种情况使用
compare to

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;
    }
}

我想你的代码可能遗漏了什么。以防万一,.

如果我声明使用该接口,我是否需要自己实现CompareTo?但是您真的想比较
快速排序的实例吗??我对此深表怀疑。如果添加接口,当然必须实现
CompareTo
方法。如果要处理从
IComparable
接口继承的字符串、int和其他类,则不需要实现
CompareTo()
。如果您要使用自定义项数组
MyItem
,那么您需要实现
IComparable
接口,直接与要比较的项(而不是
快速排序
类本身)进行比较。另外,据我所知,在QuickSort中,你必须在数组的中间取一个<代码>枢轴点,并比较<代码> ARR[i]。CopReto(ARR[PIVOT)而不是<代码> A[i]。CompareTo(Aj[j])< /> >或<代码> A[i]。CompareTo(A(低(高)))< /代码>。很棒的答案。还要注意的是,你不需要设置“arr”参数“ref”,因为不管“arr”的传递方式如何,数组成员都可以修改。菲利普,这些答案有用吗?@Andrew是的,他们帮了很多忙!
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;
    }
}
    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;
    }