通用链表的排序

6

除了排序,我已经在通用链表中完成了所有内容。我不知道如何使用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();
}

将其转换为数组并排序,然后再转换回去也违反了指令。


1
你需要编写一个方法,将一个Node<T>与另一个进行比较。你可能只需转发对包含项的T.CompareTo的调用。 - pm100
实现IComparable - MethodMan
2个回答

6

在链表中使用Node对象实现IComparable毫无意义,正如您所描述的那样。相反,您应该让您在链表中使用的类来实现它。事实上,您可以通过泛型类型约束来要求这样做:

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

完成以上步骤后,您可以在排序时将T视为IComparable使用。

这是有限制的。你可能想要创建一个客户对象的链表,但无法实现IComparable<Customer>,因为没有明显的方式来排序客户,但有时你可能想按名称、邮政编码或订单总价值对客户列表进行排序。相反,排序方法应该采用比较委托或IComparer实现并使用它。 - phoog
@phoog 我同意委托方法更标准/更好的说法。你甚至可以更简单地实现 IEnumerable 并使用 LINQ 版本。不过这是一个很好的观点。 - BradleyDotNET

2

首先,你需要了解排序算法并决定要使用哪种。一旦完成,你可以开始比较你的通用值。

如果你想采用框架方法,请勿要求你的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秒钟后再按另一种方式进行排序。因此,比较器应该是排序方法的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接