[英]Generic sorting in c#, type 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;
}
}
有任何想法嗎? :)
使用C#通用約束,您不能強制通用類型參數具有任何運算符。
解決方案是使用Comparer<T>
或您自己的IComparer<T>
實現,或者使用Comparison<T>
; 這些通過返回整數告訴您兩個對象的順序。 您將整數與常用運算符進行比較; 如果整數為負,則第一個對象較小;如果整數為零,則它們相等;如果為正數,則第一個對象較大。
由於無論如何都必須使用比較器或比較,因此您最好只使用將這些方法之一作為參數的框架方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.