有什么问题: 我正在尝试实现通用排序方法来对自定义对象进行排序,并将值类型作为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;
}
}
有什么想法吗? :)
答案 0 :(得分:0)
您无法使用C#泛型约束强制泛型类型参数拥有任何运算符。
答案 1 :(得分:0)
解决方案是使用Comparer<T>
,或您自己的IComparer<T>
实施,或Comparison<T>
;这些通过返回一个整数来告诉你两个对象的顺序。您将整数与通常的运算符进行比较;如果整数为负,则第一个对象较小,如果为零,则它们相等,如果为正,则第一个对象较大。
由于你必须使用比较器或比较,你也可以使用框架方法,将其中一个作为参数。