除了排序之外,我已经完成了通用链接列表中的所有操作。
而且我不知道如何使用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();
}
将指针转换为数组然后对其进行排序,然后将其转换回来也是违反指令的。
答案 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方法的参数。