排序通用链表

时间:2014-08-18 20:46:08

标签: c# sorting generics

除了排序之外,我已经完成了通用链接列表中的所有操作。 而且我不知道如何使用IComparable或我将如何使用它,因为它是通用的。我不知道我甚至会比较或整理什么?

public class Node<T> : IComparable<T>
{
    private Node<T> next;
    private T item;

}

所以

public int CompareTo( T other )
{
    // TODO: Find out how to do it properly
    throw new NotImplementedException();
}

将指针转换为数组然后对其进行排序,然后将其转换回来也是违反指令的。

2 个答案:

答案 0 :(得分:6)

拥有链接列表Node对象实现IComparable对于您描述的确切原因完全没有意义。相反,您在链接列表中使用的类应该实现它。实际上,您可以使用泛型类型约束来要求它:

MyClass<T> where T : IComparable<T> {}

完成后,您可以在执行排序时使用T,就好像 <{1}}一样。

答案 1 :(得分:1)

您应该做的第一件事是阅读排序算法并决定您将使用哪一种。完成后,您可以担心比较通用值。

如果您想遵循框架方法,请不要让您的T实施IComparable<T>.而是使用Comparer<T>.Default。这种方法允许您编写类以支持用户定义的比较:

public class LinkedList<T>
{
    public void Sort() { this.Sort(Comparer<T>.Default); }
    public void Sort(IComparer<T> comparer)
    {
        //todo: implement
        throw new NotImplementedException();
    }
}

我的这个答案的初始版本将比较器作为类的属性,但这确实是不正确的,因为链表不是固有的排序类型。您可能希望以一种方式对列表进行排序,然后在2秒后以不同的方式对其进行排序。因此,比较器应该是sort方法的参数。