如何将元组与条目的自定义比较器进行比较,但与元组的默认比较器进行比较



我想对List<Tuple<Vertex, Vertex>>进行排序,即元组列表,其中每个元组包含一定数量的顶点
Vertex是一个自定义类,ListTuple来自System

我已经有几个Comparer提供了一种比较两个顶点的方法,例如:
class MyVertexComparer1 : Comparer<Vertex>class MyVertexComparer2 : Comparer<Vertex>

现在,我想使用这些现有的Comparer根据默认的元组比较对列表进行排序,即比较第一个条目,并且仅在平局的情况下比较下一个条目
此排序中两个元组的比较应由一个自定义的VertexComparers确定。

我知道我可以编写一个在实现中使用MyVertexComparerclass 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;
}
}

最新更新