2016-04-13 7 views
3

Ich habe zwei Listen des gleichen Typs.Liste <T> .Except (Liste <T>) funktioniert nicht wie erwartet

Eine Liste ist ein deserialisiertes JSON-Objekt, das aus einer Datei geladen und in den richtigen Typ umgewandelt wird.

Die andere ist eine Liste von Objekten des gleichen Typs erstellt.

Als ich List2.Except(List1) erwarte ich alles in List2 zu sehen, die nicht in List1

In diesem Fall ist, wird List2 alles haben, was List1 hat und nichts mehr, so dass ich erwarte, dass ein resultierendes Enumerable<T> von Größe zu sehen 0, aber ich sehe nur die Gesamtheit von List2, als ob der Vergleich nie passiert ist.

IEnumerable<Review> newReviews = reviews.Except(savedRvReviews, new ReviewComparer()); 

Ich versuchte auch, einen EqualityComparer verwenden, Code unter:

public class ReviewComparer : IEqualityComparer<Review> 
{ 
    public bool Equals(Review x, Review y) 
    { 
     return x.ReviewID == y.ReviewID; 
    } 

    public int GetHashCode(Review rv) 
    { 
     return EqualityComparer<Review>.Default.GetHashCode(rv); 
    } 
} 

und bekam die gleichen Ergebnisse.

Iterieren durch List2 und List1 über eine LINQ-Abfrage suchen, bekomme ich die erwarteten Ergebnisse von 0.

foreach (Review s in reviews) 
{ 
    var m = from k in savedRvReviews 
    where k.ReviewID == s.ReviewID 
    select k; 

    if (m.Count() == 0) 
    { 
     // Do something with new reviews 
    } 
} 

-Code für Review Typ:

public class Review : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    [Browsable(false)] 
    public string ReviewID { get; set; } 
    public string ProductID { get; set; } 
    public DateTime DateSubmitted { get; set; } 
    public string ReviewTitle { get; set; } 

    [Browsable(false)] 
    public string ReviewDescription { get; set; } 
    public int ReviewMark { get; set; } 

    [Browsable(false)] 
    public bool Approved { get; set; } 
} 
+0

Warum posten Sie nicht den Code, den Sie tun, außer in? –

+0

ich habe es hinzugefügt, aber es ist nichts besonderes daran. – 5SK5

+0

Wenn die Ausnahme nicht wie erwartet funktioniert und Sie sie richtig verwenden, haben Sie wahrscheinlich keinen get-Hash-Code implementiert und überschreiben Sie den Wert gleich –

Antwort

5

Sie haben einen Vergleich geschrieben, bei dem zwei Bewertungen gleich sind, wenn ihre IDs gleich sind, aber Sie den Hashcode nicht geändert haben. Zwei Bewertungen, die gleich sind, sollten den gleichen Hashcode erzeugen, und Ihre nicht.

Der einfachste Weg, um es passieren zu lassen wäre, den gleichen Hashcode für Bewertungen, die gleich sind. Zum Beispiel mit dem Hashcode der einzigen Sache, die zwei Bewertungen gleich macht, die ID:

public class ReviewComparer : IEqualityComparer<Review> 
{ 
    public bool Equals(Review x, Review y) 
    { 
     return x.ReviewID == y.ReviewID; 
    } 

    public int GetHashCode(Review rv) 
    { 
     return rv.ReviewID.GetHashCode(); 
    } 
} 
0

Lösung wurde das Hinzufügen IEquatable<Review> Schnittstelle zu meinem Review Klasse und Implementierung der Equals Methode als solche:

public bool Equals(Review rv) 
    { 
     return this.ReviewID == rv.ReviewID; 
    } 

Der Rest des Codes, den ich postete, funktionierte gut, aber das war das Stück, das ich vermisste.

+0

Dies hat das Problem nicht gelöst, Sie ändern etwas anderes, das mit dem Hash-Code zu tun hat. Siehe nvoigts Antwort. – usr

Verwandte Themen