【问题标题】:How to compare Tuples with a custom Comparer for entries, but the default Comparer for the Tuple?如何将元组与条目的自定义比较器进行比较,但元组的默认比较器?
【发布时间】:2020-12-14 07:57:24
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您能否澄清在排序过程中使用默认比较器和自定义比较器?根据我对您所要求的内容的理解,默认比较器似乎可以满足您的要求。如果您在列表中调用Sort(),那么生成的订单有什么问题?
  • @CoolBots 我已经更新了这个问题,我希望澄清自定义和默认比较器的用法。

标签: c# tuples icomparer


【解决方案1】:

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

如果您想重用现有的Comparers,您可以通过IComparable<Vertex>.CompareTo 实现委托/共享该功能;但是如果不为Tuple 写另一个Comparer,你就不能做你想做的事(它适用于每种Tuple,因为Tuple<T1, T2> 是一个不同的类型而不是@ 987654333@),或在Vertex 类型上实现IComparable<Vertex>

【讨论】:

  • 感谢您的回答。我的理解是否正确,将Vertex 设为IComparable 会为顶点定义一种比较?如果不是,我如何定义几种方法来比较顶点与IComparable<Vertex> 方法?
  • 它将有效地定义一个默认入口点方法来比较Vertex类型;在该方法中,您仍然可以编写逻辑以根据需要将比较委托给其他方法。例如,您的Vertex 类型可以有一个接受ComparerComparers 数组的构造函数,可以在CompareTo 方法中使用,具体取决于某些逻辑、值等。跨度>
  • 好吧,我想我会坚持使用Comparer 来代替Tuple,以便将列表排序变体与Vertex 数据类分开。仍然很高兴知道没有办法以这种方式重用默认比较。
【解决方案2】:

以防将来有人偶然发现:这是我最终得到的通用实现。 这有一些我希望避免的缺点,但它至少可以透明地重用现有的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;
    }
}

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多