如何解决如何将元组与用于条目的自定义比较器进行比较,但将元组的默认比较器进行比较?
我想对List<Tuple<Vertex,Vertex>>
(即元组列表)进行排序,其中每个元组都包含一定数量的顶点。Vertex
是一个自定义类,List
和Tuple
来自System
。
我已经有几个Comparer
,它们提供了一种比较两个顶点的方法,例如:class MyVertexComparer1 : Comparer<Vertex>
和class MyVertexComparer2 : Comparer<Vertex>
现在,我想使用这些现有的Comparer
根据默认的元组比较对列表进行排序,即比较第一个条目,并且仅在平局比较下一个条目的情况下。
排序中两个元组的比较应由自定义VertexComparers之一确定。
我知道我可以编写一个在实现中使用class MyTupleComparer : Comparer<Tuple<Vertex,Vertex>>
的{{1}},也许可以使用一个通用参数来指定要使用哪个VertexComparer。
但是,这很不对劲,因为我只需要对元组重复默认的比较即可。
而且,我不知道如何将其扩展到具有两个以上顶点的元组,而每个数量的顶点都没有专用的比较器类。
解决方法
将Vertex
设为IComparable<Vertex>
,Sort
上的默认List<T>
将按照您的描述工作;也就是说,Tuple
将使用默认的比较器,因为没有提供自定义比较器,并且将Vertex.CompareTo
方法用于条目。
如果您想重复使用现有的Comparer
,则可以通过IComparable<Vertex>.CompareTo
实现来委派/共享功能;但如果您没有为Comparer
写另一个Tuple
(就对每种Tuple
都写不了,就无法做您想做的事,因为Tuple<T1,T2>
是 与Tuple<T1,T2,T3>
类型不同),或在IComparable<Vertex>
类型上实现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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。