2017-05-12 2 views
0

Es ist ziemlich selbsterklärend, was ich versuche zu tun.Erhalten von eindeutigen ungeordneten Tupeln aus einer Sammlung: Wo ist der Fehler in meinem Code?

Mein Code:

public class Solution 
{  
    public static void Main(String[] args) 
    { 
     Tuple<int, int> t1 = Tuple.Create(1,2); 
     Tuple<int, int> t2 = Tuple.Create(1,2); 
     Tuple<int, int> t3 = Tuple.Create(2,1); 
     List<Tuple<int, int>> tups = new List<Tuple<int, int>>() { t1, t2, t3 }; 
     var dist = tups.Distinct(new TupleComparer()); 
     foreach(var t in dist) 
      Console.WriteLine("{0},{1}", t.Item1, t.Item2); 
    } 
} 


class TupleComparer : IEqualityComparer<Tuple<int, int>> 
{ 
    public bool Equals(Tuple<int,int> a, Tuple<int, int> b) 
    { 
     return a.Item1 == b.Item1 && a.Item2 == b.Item2 
      || a.Item1 == b.Item2 && a.Item2 == b.Item1 ; 
    } 

    public int GetHashCode(Tuple<int, int> t) 
    { 
     return t.Item1 + 31 * t.Item2; 
    } 
} 

Erwartete Ausgabe:

1,2 

(oder 2,1)

tatsächliche Ausgang:

1,2 
2,1 

Wo ist der Fehler?

Ich hoffe, dass die Eingabe dieser Zeile mein Text-zu-Code-Verhältnis hoch genug macht, um die Frage zu stellen.

+0

Hast du Klammern versuchen? '(a.Item1 == b.Item1 && a.Item2 == b.Item2) || (a.Item1 == b.Item2 && a.Item2 == b.Item1) ' – itsme86

Antwort

1

von MSDN:

// If Equals() returns true for a pair of objects 
// then GetHashCode() must return the same value for these objects. 

Das ist nicht der Fall in Ihrer Implementierung ist.

für Tupel (1,2), 63 GetHashCode

für Tupel erzeugt (2,1) 33. Diese

Distinct wäre() nutzt GetHashCode, Equals nicht.

Reihenfolge der Dinge in Ihrer Implementierung.

Die Equals-Implementierung berücksichtigt dies nicht, da die Reihenfolge dort keine Rolle spielt.

So sind die Ergebnisse in der Tat unterscheidet sich von der HashCode's Sicht;)

Verwandte Themen