2017-02-17 19 views
1

たとえば、ジェネリック関数に渡される同じ(任意の)タイプの2つの異なるオブジェクトがあるとします。私は、彼らが議論としてどの順序で渡されても、毎回同じ方法で注文する方法が必要です。それらの順序は重要ではありません。ちょうど、同じハッシュコードを持っているという点で一貫していますが、等しくはありません。ハッシュコードが異なる大部分のケースでは、ハッシュコードが単純に使用されます。同じハッシュコードを持つ2つの異なるオブジェクトの確定的なソート

仮定:

  • オブジェクトが
  • .Equalsを固定することはできません

    • 同じベース型
    • 同じハッシュコード
    • なく、同じオブジェクト
    • 参照タイプは偽
    • オブジェクトを返します。 .ReferencesEqualsはfalseを返します
    • どちらのオブジェクトは、順序が唯一うまくいけば、誰かがこの、まれに創造的な解決策を考え出すことができ、特定のアセンブリ

    の特定のランタイム内で一貫している必要がありますが、面倒なエッジケース

  • NULLであること私は逃した。 、(理想的には最後の手段として、他の可能な手段を試してみました)その後

    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>に要素を追加:ありがとう

  • +0

    あなたのメモリアドレスをソートしようとすることはできますが、これはアプリを実行している同じセッションでのみ一致します。アプリを再起動すると、アドレスが変更されます。 https://msdn.microsoft.com/en-us/library/zcbcf4ta.aspx – Mangist

    +1

    @Mangist「オブジェクトを固定することはできません」 – TheCatWhisperer

    答えて

    1

    は、まずアイデンティティに純粋に作品等値比較子を定義します、キーとしてのオブジェクト、および値としてのインクリメント番号が含まれます。

    この値はタイブブレーカーになり、毎回同じ順序が保証されます。

    +1

    「IEqualityComparer」を使用してソートすることはできません。あなたは 'IComparer'が必要です。 – Servy

    +0

    @Servyインターフェイスはほとんど無関係です – TheCatWhisperer

    +0

    @TheCatWhispererインターフェイスは*大いに*関連しています。 1つはあなたが求めているものを達成し、もう1つは達成しません。 – Servy

    関連する問題