0

很多谷歌搜索,仍然没有答案。

问题是什么: 我正在尝试实现通用排序方法来对自定义对象和值类型进行排序,如 int、uint 等。快速排序、堆排序等没有问题。此外,我发现计数排序不可能,因为这是特异性。所有数据必须是非负整数。

问题:

where T : struct..

不要给需要的一元运算符“+-”,据我所知,不可能强制它。如何设置正确的类型约束,或者如何强制 T 使用运算符“+-”?

public interface ISortMethod<T> where T : IComparable<T>
{
    T[] Sort(T[] tablica);
}

public class CountingSort<T> : ISortMethod<T>
    where T : IComparable<T> 
{
    public T[] Sort(T[] tablica)
    {
        T[] tab2 = (T[])tablica.Clone();
        return Sortuj(tab2);
    }

    private T[] Sortuj(T[] tab)
    {
        T min = tab[0];
        T max = tab[0];

        T[] res = new T[tab.Length];

        //< 0 wczesniejsza this
        for (int i = 0; i < tab.Length; i++)
        {
            if (tab[i].CompareTo(max) > 0)
                max = tab[i];

            if (tab[i].CompareTo(min) < 0)
                min = tab[i];
        }

        T[] cData = new T[**(max - min)** + 1];

        for (int i = 0; i < tab.Length; i++)
            **cData[tab[i] - min] += 1**;

        for (int i = 1; i < cData.Length; i++)
            cData[i] += cData[i - 1];

        for (int i = tab.Length-1; i >= 0 ; i--)
        {
            res[cData[tab[i] - min] - 1] = tab[i];
            cData[tab[i] - min]--;
        }

        return res;
    }
}

有任何想法吗?:)

4

2 回答 2

0

您不能使用 C# 泛型约束强制泛型类型参数具有任何运算符。

于 2012-09-11T11:27:08.323 回答
0

解决方案是使用Comparer<T>, 或您自己的IComparer<T>实现,或Comparison<T>; 这些通过返回一个整数告诉你两个对象的顺序。您将整数与通常的运算符进行比较;如果整数为负,则第一个对象较小,如果为零,则它们相等,如果为正,则第一个对象较大。

由于无论如何您都必须使用比较器或比较器,您不妨只使用将其中之一作为参数的框架方法。

于 2012-09-11T11:35:40.143 回答