答えて
この等価の仕様はOrderRuleクラスではなく、コレクションであるため、IEqualityComparerを受け入れるHashSetのコンストラクタオーバーロードを使用してください。
public class MyOrderRuleComparer : EqualityComparer<OrderRule>
{
private IEqualityComparer<string> _c = EqualityComparer<string>.Default;
public override bool Equals(OrderRule l, OrderRule r)
{
return _c.Equals(l.Property, r.Property);
}
public override int GetHashCode(OrderRule rule)
{
return _c.GetHashCode(rule.Property);
}
}
...
HashSet<OrderRule> rules = new HashSet(new MyOrderRuleComparer());
キーとしてOrderRule.Propertyを使用することによって、あなたは、インスタンスをセットに追加された後、それが変化してはならないことを意味するものであることに注意してください。このため、デベロッパーチームに応じてIEquatable<OrderRule>
を実装するのが最適なアプローチになる可能性があります。
単純に 'public bool Equals(OrderRule l、OrderRule r){return l.Property == r.Property; } '代わりにデフォルトの' IEqualityComparer
Btw、私は、(クラス全体の等価性を上書きするのではなく、他の場所では不適切かもしれない)HashSetに対する "等価"の定義を制限する考え方が好きです。私はHashSetがそれを行うことができるのか分からなかった。たくさんの意味があります。 –
それはちょうどスタイルの問題だと思います。この方法で、.NETフレームワーク実装者に任せて、フレームワークから現在の実装をコピーする代わりに、IEqualityComparer
私はまだ両方が
あなたがオーバーライドすることができます等しい考慮する必要が 同じプロパティが異なる方向を持つ2つのOrderRulesを追加する場合Equals
とGethashCode
および/または実装IEquatable<OrderRule>
:
public class OrderRule: IEquatable<OrderRule>
{
public OrderRule(string property)
{
this.Property = property;
}
public OrderDirection Direction { get; set; }
public String Property { get; }
public OrderRule Rule { get; set; }
public bool Equals(OrderRule other)
{
return (other != null && other.Property == this.Property);
}
public override int GetHashCode()
{
return Property?.GetHashCode() ?? int.MinValue;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if(ReferenceEquals(this, obj))
return true;
OrderRule other = obj as OrderRule;
return this.Equals(other);
}
}
GetHashCode
で使用されているプロパティまたはフィールドを変更できないようにするため、プロパティを読み取り専用にしています。
Why?:「ガイドライン:GetHashCodeメソッドによって返された整数は理想的 を変更しないでください、可変オブジェクトのハッシュコードが変異することができない唯一のフィールドから計算されなければならないので、オブジェクトのハッシュ値についても同様ですその全生涯。
この値はf.eです。辞書またはHashSetでハッシュコードを計算するために使用されます。オブジェクトが追加された後に変更された場合、それはもはや検出されませんでした。
私は、ハッシュのキーとしてプロパティを使用すると不変でなければならないことを言いたいのですが。 – wigy
- 1. は、私は以下のクラスを持っている
- 2. は、私は以下のクラスを持っているCCW順
- 3. Unityは、私は以下のクラスを持っているリポジトリ
- 4. は、私は以下のクラスを持っているリスト
- 5. 私は以下のクラスを持っているJavaの
- 6. 私は以下のクラスを持っている
- 7. 私は以下のクラスを持っている
- 8. は、私は以下のクラスを持って反射
- 9. 私は以下のクラスを持ってLINQの
- 10. 私は以下の表を持って
- 11. の移行は、私は以下のクラスを持っているCSS3
- 12. は、どのように私は以下のクラスを持っているシーケンス
- 13. パターンは、私は以下のようにポリシーのクラスを持っている
- 14. RSpecのは、私は以下のクラス構造を持っている
- 15. は、私は以下のクラスを持っているのWindows Azureテーブルストレージ
- 16. は、どのように私は以下のクラスを持っている
- 17. Javaの8ストリームは、私は以下のクラスを持っているリスト
- 18. は、私は以下の持っている私のソースリスト
- 19. は、私は以下に定義されたクラスを持っているのPython
- 20. は、私は以下の表を持っているMySQLの
- 21. スカラ/ JSONは私のプレイサーバーに以下のクラスを持っている
- 22. は、私は、以下の機能を持っているR
- 23. は、私は、以下の機能を持っているJSアレイ
- 24. は、私は、以下の「辞書」を持っているJS
- 25. は、私は、以下の機能を持っているHTTPステータスコード
- 26. は、私は以下のコードを持っている
- 27. は、私は以下のメソッドを持っているハングアウト
- 28. MessageDlgは、私は以下のコードを持っている音
- 29. は、私は以下のコードを持っているgetRowDataがnull
- 30. SSRSは、私は以下のデータテーブルを持っている
EqualsメソッドとGetHashCodeメソッドを実装する必要があります –
あなたが言及したように実装するのを妨げる原因は何ですか? –
@TimSchmelterプロパティが同じでDirectionが異なる2つのOrderRulesを追加する場合でも、どちらも等しいとみなす必要があります。 –