簡體   English   中英

C#中的通用排序,類型約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM