2017-02-17 67 views
1

比方說,我有兩個不同的傳遞給一般函數的相同(任意)類型的對象。我需要一種方法來每次都以相同的方式排列它們,而不管它們作爲參數傳入的順序。它們的順序並不重要,只是在邊緣情況下它們具有相同的哈希碼,但不通過.equal。在大多數情況下,他們有不同的哈希碼,哈希碼將被簡單地使用。具有相同哈希碼的兩個不同對象的確定性排序

假設:

  • 相同的基本類型
  • 相同的散列碼
  • 不相同的對象
  • 參考類型
  • 對象不能被釘扎
  • .Equals返回false
  • 對象.ReferencesEquals返回假
  • 沒有一個對象是空
  • 順序只需要在特定組件

的具體運行中一致希望,有人能拿出一個創造性的解決方案,這一點,罕見的,但麻煩的邊緣情況我已經錯過了。由於

+0

你可以嘗試對他們的內存地址進行排序,但這隻會在運行你的應用程序的同一會話期間保持一致。一旦你重新啓動應用程序,地址將會改變。 https://msdn.microsoft.com/en-us/library/zcbcf4ta.aspx – Mangist

+1

@Mangist「無法固定對象」 – TheCatWhisperer

回答

1

首先定義一個相等比較,關於身份的工作純粹:

private static ReferenceEqualityComparer<T> : IEqualityComparer<T> where T:class 
{ 
    public bool Equals(object x, object y) => ReferenceEquals(x, y); 

    public int GetHashCode(object obj) => RuntimeHelpers.GetHashCode(obj); 
} 

然後(最好作爲最後的手段,嘗試過其他可能的方式),將這些元素添加到Dictionary<T, int>有,作爲其比較器,其中的對象作爲鍵,以及遞增的數字作爲值。

該值成爲您的決勝球,並保證每次都保持相同的順序。

+1

您無法使用「IEqualityComparer」進行排序。你需要一個'IComparer'。 – Servy

+0

@Servy接口在很大程度上是不相關的 – TheCatWhisperer

+0

@TheCatWhisperer接口*非常相關。一個完成你所要求的,而另一個不完成。 – Servy

相關問題