我想对List<Tuple<Vertex, Vertex>>
进行排序,即元组列表,其中每个元组包含一定数量的顶点Vertex
是一个自定义类,List
和Tuple
来自System
。
我已经有几个Comparer
提供了一种比较两个顶点的方法,例如:class MyVertexComparer1 : Comparer<Vertex>
和class MyVertexComparer2 : Comparer<Vertex>
现在,我想使用这些现有的Comparer
根据默认的元组比较对列表进行排序,即比较第一个条目,并且仅在平局的情况下比较下一个条目
此排序中两个元组的比较应由一个自定义的VertexComparers确定。
我知道我可以编写一个在实现中使用MyVertexComparer
的class MyTupleComparer : Comparer<Tuple<Vertex, Vertex>>
,也许可以使用一个通用参数来指定要使用的VertexComparer。然而,这感觉是错误的,因为我只是简单地重复元组的默认比较
此外,我不知道如何将其扩展到具有两个以上顶点的元组,而不为每个顶点数量提供专用的比较器类。
将Vertex
设为IComparable<Vertex>
,List<T>
上的默认Sort
将按照您的描述工作;也就是说,由于没有提供自定义比较器,Tuple
将使用默认比较器,并且Vertex.CompareTo
方法将用于条目。
如果您想重用现有的Comparer
,您可以委托/共享IComparable<Vertex>.CompareTo
实现的功能;但是,如果不为Tuple
编写另一个Comparer
(它将用于每种类型的Tuple
,因为Tuple<T1, T2>
是与Tuple<T1, T2, T3>
不同的类型(,或者在Vertex
类型上实现IComparable<Vertex>
,就无法执行您想要的操作。
如果将来有人偶然发现这一点:以下是我最终得到的通用实现。这有我希望避免的缺点,但它至少透明地重用了现有的Comparer
。
class ComparePair<TComp> : Comparer<Tuple<Vertex, Vertex>> where TComp : Comparer<Vertex>, new() {
private readonly TComp comp = new TComp();
public override int Compare(Tuple<Vertex, Vertex> a, Tuple<Vertex, Vertex> b) {
int res = comp.Compare(a.Item1, b.Item1);
return res == 0 ? comp.Compare(a.Item2, b.Item2) : res;
}
}