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

解決策はComparer<T>、または独自のIComparer<T>実装、またはComparison<T>;を使用することです。これらは、整数を返すことで、2 つのオブジェクトの順序を示します。整数を通常の演算子と比較します。整数が負の場合、最初のオブジェクトは小さくなり、ゼロの場合は等しくなり、正の場合、最初のオブジェクトは大きくなります。

とにかく比較子または比較を使用する必要があるため、これらのいずれかをパラメーターとして取るフレームワーク メソッドを使用することもできます。

于 2012-09-11T11:35:40.143 に答える
0

C# ジェネリック制約を使用して、ジェネリック型パラメーターに演算子強制することはできません。

于 2012-09-11T11:27:08.323 に答える