[英]How to use a custom comparer for EqualityComparer<T>.Default?
[英]How to compare Tuples with a custom Comparer for entries, but the default Comparer for the Tuple?
我想對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>>
在其實現中使用MyVertexComparer
,可能帶有一個指定要使用哪個 VertexComparer 的通用參數。 但是,這感覺不對,因為我只會重復元組的默認比較。
此外,如果沒有針對每個頂點數量的專用比較器類,我看不出如何將其擴展到具有兩個以上頂點的元組。
使Vertex
成為IComparable<Vertex>
,並且List<T>
上的默認Sort
將按照您的描述工作; 也就是說,默認比較器將用於Tuple
,因為沒有提供自定義比較器,並且Vertex.CompareTo
方法將用於條目。
如果要重用現有的Comparer
,可以使用IComparable<Vertex>.CompareTo
實現委托/共享功能; 但你不能做你想做的任何不寫其他Comparer
的Tuple
(這將會是對每種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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.