c#中的泛型排序,类型约束

时间:2012-09-11 11:18:42

标签: c# oop types constraints

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

有什么问题: 我正在尝试实现通用排序方法来对自定义对象进行排序,并将值类型作为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;
    }
}

有什么想法吗? :)

2 个答案:

答案 0 :(得分:0)

您无法使用C#泛型约束强制泛型类型参数拥有任何运算符。

答案 1 :(得分:0)

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

由于你必须使用比较器或比较,你也可以使用框架方法,将其中一个作为参数。