簡體   English   中英

如何將元組與條目的自定義比較器進行比較,但元組的默認比較器?

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

我想對List<Tuple<Vertex, Vertex>>進行排序,即元組列表,其中每個元組包含一定數量的頂點。
Vertex是一個自定義類, ListTuple來自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實現委托/共享功能; 但你不能做你想做的任何不寫其他ComparerTuple (這將會是對每種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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM