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

How to compare Tuples with a custom Comparer for entries, but the default Comparer for the Tuple?

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

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

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

我知道我可以编写一个 class MyTupleComparer : Comparer<Tuple<Vertex, Vertex>>,在其实现中使用 MyVertexComparer,可能带有指定要使用哪个 VertexComparer 的通用参数。 但是,这感觉不对,因为我只是重复元组的默认比较。
此外,我看不出如何将其扩展到具有两个以上顶点的元组,而没有针对每个顶点数的专用比较器class。

Vertex 设为 IComparable<Vertex>List<T> 上的默认 Sort 将按照您的描述工作;也就是说,默认比较器将用于 Tuple,因为没有提供自定义比较器,并且 Vertex.CompareTo 方法将用于条目。

如果您想重用现有的 Comparer,您可以 delegate/share 使用 IComparable<Vertex>.CompareTo 实现的功能;但是如果不为 Tuple 写另一个 Comparer 就不能做你想做的事(它适用于每种 Tuple,因为 Tuple<T1, T2>Tuple<T1, T2, T3> 不同的类型 ),或在 Vertex 类型上实施 IComparable<Vertex>

以防将来有人偶然发现:这是我最终得到的通用实现。 这有我希望避免的缺点,但它至少透明地重用了现有的 Comparers。

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;
    }
}