2017-11-06 8 views
-5

タプルを辞書のキーとして使用したい場合は、いくつかのコードがありますが、キーが正しく認識される問題があります。 Tとキーの両方がタイプSystem.Tuple <ストリング、domain.MyClassであるタプルのEquals()がfalseを返す可能性があります

Dictionary<Tuple<string, MyClass>, MyClass> Map = new Dictionary<Tuple<string, MyClass>, MyClass> 
{ 
    { Tuple.Create(s1, new MyClass { value = v1 }), new MyClass { value = r1 } } 
} 

Tuple<string, MyClass> key = Tuple.Create(s, o); 
foreach (Tuple<string, MyClass> t in Map.Keys) 
{ 
    if (t.GetType() == key.GetType() 
    && t.Item1.Equals(key.Item1) && t.Item2.Equals(key.Item2) 
    && t.Item1.GetHashCode() == key.Item1.GetHashCode() && t.Item2.GetHashCode() == key.Item2.GetHashCode()) 
    { 
    bool test2 = t.Equals(key); // False? 
    bool test3 = t.GetHashCode() == key.GetHashCode(); // True 
    } 
} 
  • >
  • IはMyClassの内のequalsメソッドを実装しているように、個々の値は、等しいと見なされるべきである - これはまた、ありますチェックされたif文
  • その場合、私はtest2が真であると期待していますが、私が見つけることができるドキュメンテーションは、2つのコンポーネントが同じ型でなければならないことを示しています。equalsをオーバーライドすることによって保証されます)
+1

Tとは何ですか?それが最も偽である可能性が高いからです。 Tが参照型の場合、参照型はメンバではなく参照を比較している可能性が高く、この場合、Tがまったく同じインスタンスでない限りFalseを返します。 – Bauss

+2

もしそれを再現することができれば助けが容易になるでしょう...あなたは[mcve]を提供できますか? –

+0

'T'がクラスである場合、あなたの型' T'が 'object.Equals'の適合性をオーバーライドしない限り、同じ*プロパティ*を持つ2つのインスタンスは等しくありません(' Equals'はfalseを返します)。 – HimBromBeere

答えて

0

これは、平等のために必要とされています

t.Item2.Equals(key.Item2) 

は、だから、Tに依存します。 Tが値型の場合、値が等しい場合はtrueを返します。

Tが参照型の場合、Item2が同じインスタンスを参照する場合はtrueを返し、等しい場合はT overrides等しい場合はtrueを返します。

前にTの2つのインスタンスの間で==をチェックしています。それはおそらく冗長ですが、同じ理由で失敗することもあります。 ==演算子をオーバーライドしない限り、参照型が同じかどうかをチェックします。

私はまず==のチェックを削除したいと思います。Equalsを使用してから、期待したときにEqualsがtrueを返すと期待できることを確認してください。これは、Tが予期した動作を与えるためにEqualsをオーバーライドすること、または両方が同じインスタンスであることを保証することです。

+0

コードが 't.Equals(key)'の行に到達するためには、 't.Item2.Equals(key.Item2)'は既に 'true'を返さなければならなかったので、それは本当です。 – Servy

+0

私はif文で呼び出されたT.Equalsメソッドを実装していましたが、Tuple型オブジェクトを比較するときに呼び出されるobject.Equalsをオーバーライドすることは控えました^^ –

関連する問題