2012-06-21 58 views
0

我正在構建圖並使用HashSet<T>驗證要添加的頂點的唯一性。如果一個項目沒有被添加,它的方法Add()返回true。在兩個方向驗證一對的唯一性:要添加到容器中的A-B或B-A

我可以使用哪種邊緣技術?我需要驗證一對A-B或一對B-A對是否添加了一次。

這裏的數據的輕量級版本我使用:

interface INode 
{ 
    INode[] Previous { get; } 

    Node Next { get; } 
} 

然後,我有:

INode current; 
INode[] allPrevious = ExternalMethod1(current); 
INode[] allNext = ExternalMethod2(current); 

所以我不能建立一個曲線圖,同時去圓遞歸,我都存儲的數據迭代。

+0

您能否提供該圖表的更多信息。戰略可能將取決於該圖。 –

+2

'A'和'B'是可訂購的嗎?如果是這樣,顯而易見的是總是首先放置「較小」的項目。 –

+0

@MareInfinitus:我已經更新了我的問題。 – abatishchev

回答

2

爲邊緣創建您自己的相等比較器實現並將HashSet<T>.Comparer設置爲它的一個實例。例如:

class Edge 
{ 
    public string From { get; set; } 
    public string To { get; set; } 
} 

class EdgeEqualityComparer : IEqualityComparer<Edge> 
{ 
    public bool Equals(Edge lhs, Edge rhs) 
    { 
     return (lhs.From.Equals(rhs.From) && lhs.To.Equals(rhs.To)) || 
       (lhs.From.Equals(rhs.To) && lhs.To.Equals(rhs.From)); 
    } 

    public int GetHashCode(Edge e) 
    { 
     return e.From.GetHashCode()^e.To.GetHashCode(); 
    } 
} 

當然,你也必須檢查無效。所有standard caveats也適用於GetHashCode實施。