1

私は独自の汎用 Java データ構造ライブラリを作成しましたが、現在は C# で作成していますが、個別にリンクされたリストを並べ替える CompareTo メソッドを実装しようとして立ち往生しています。これが私のコードです:

class SortedSinglyLinkedList<T> : IComparable // my class
// [irrelevant stuff...]
// Sorts the list, from the least to the greatest element
    public void sort()
    {
        for (int i = 0; i < count; i++)
        {
            for (int j = 0; j < count; j++)
            {
                if (get(i).CompareTo(get(j)) < 0) // ERROR -> 'T' does not contain a definition for 'CompareTo' and no extension method 'CompareTo' accepting a first argument of type'T' could be found (are you missing a using directive or an assembly reference?)
                {
                    move(i, j); // this method simply moves a node from i to j
                }
            }
        }
    }

    // Compares 2 elements
    int IComparable<T>.CompareTo(T other)
    {
        // what should I put here to make it work?
    }
4

1 に答える 1

3

これを実現する 1 つの方法は、リストの要素が比較可能であることを要求することです。つまり、それらにIComparableインターフェイスを実装させます。次のように、ジェネリック型制約を使用してこれを表現しますT

public class SortedSinglyLinkedList<T> : where T : IComparable 

これを行うより一般的な方法は、このインターフェイスを実装しない要素をリストに含めることもできるIComparableため、多くの C# BCL ジェネリック コレクション クラス (SortedDictionaryまたは などSortedList)で使用される戦略に従うことです。IComparerインスタンスを使用して比較を実行します。 .

public class SortedSinglyLinkedList<T>
{
    private readonly IComparer<T> _comparer;

    // ...

    public SortedSinglyLinkedList()
    {
        _comparer = Comparer<T>.Default; // use the default.
        // ...
    }

    public SortedSinglyLinkedList(IComparer<T> comparer)
    {
        _comparer = comparer ?? Comparer<T>.Default;
        // ...
    }
}

メソッドでは、Sortこの比較インスタンスを使用して比較を実行します。

_comparer.Compare(get(i), get(j));
于 2015-05-31T00:40:11.867 に答える