2016-07-11 26 views
1

Ich habe eine Liste von einem Objekt List<IReportRelationMapping>, die ich überprüfen müssen, wenn die Liste keine spezifische ReportRelationMapping ObjektWie überschreiben Enthält die Eigenschaft einer Liste in C#?

Hier enthält, ist, wie meine ReportRelationMapping wie

public class ReportRelationMapping : IReportRelationMapping 
{ 
    public string Name { get; set; } 

    public IReportRelation LocalRelation { get; set; } 

    public IReportRelation ForeignRelation { get; set; } 

    public IReportRelationMapping RelatedThrough { get; set; } 
} 

Die Liste sieht ein Objekt enthält, wenn this.LocalRelation == passed.LocalRelation && this.ForeignRelation == passed.ForeignRelation oder this.LocalRelation == passed.ForeignRelation && this.ForeignRelation == passed.LocalRelation

Hier ist, was ich getan, um haben die Contains Eigenschaft der Liste

außer Kraft zu setzen
public class ReportRelationMapping : IReportRelationMapping 
{ 
    public string Name { get; set; } 

    public IReportRelation LocalRelation { get; set; } 

    public IReportRelation ForeignRelation { get; set; } 

    public IReportRelationMapping RelatedThrough { get; set; } 

    public bool Equals(ReportRelationMapping other) 
    { 
     if (other == null) 
     { 
      return false; 
     } 

     if (object.ReferenceEquals(this, other)) 
     { 
      return true; 
     } 

     if (this.GetType() != other.GetType()) 
     { 
      return false; 
     } 

     return (this.LocalRelation == other.LocalRelation && this.ForeignRelation == other.ForeignRelation) 
      || (this.LocalRelation == other.ForeignRelation && this.ForeignRelation == other.LocalRelation); 
    } 

    public override bool Equals(object other) 
    { 
     if (other == null) 
     { 
      return false; 
     } 

     if (object.ReferenceEquals(this, other)) 
     { 
      return true; 
     } 

     if (this.GetType() != other.GetType()) 
     { 
      return false; 
     } 

     return this.Equals(other as ReportRelationMapping); 
    } 

    public override int GetHashCode() 
    { 
     int hash = 14; 
     hash = (hash * 7) + this.ForeignRelation.GetHashCode(); 
     return (hash * 7) + this.LocalRelation.GetHashCode(); 
    } 

    public static bool operator ==(ReportRelationMapping lhs, ReportRelationMapping rhs) 
    { 
     // Check for null on left side. 
     if (Object.ReferenceEquals(lhs, null)) 
     { 
      if (Object.ReferenceEquals(rhs, null)) 
      { 
       // null == null = true. 
       return true; 
      } 

      // Only the left side is null. 
      return false; 
     } 
     // Equals handles case of null on right side. 
     return lhs.Equals(rhs); 
    } 

    public static bool operator !=(ReportRelationMapping lhs, ReportRelationMapping rhs) 
    { 
     return !(lhs == rhs); 
    } 

} 

Aber aus irgendeinem Grund, auch wenn die Liste ein gebendes Objekt enthält, bekomme ich false oder "enthält nicht das Objekt." Wenn ich meinen Code debugge, kann ich sehen, dass der Debugger die Equal Methode erreicht, so dass es meinen Code durchläuft, aber es erreicht nie GetHashCode Methode. Ich bin mir nicht sicher, ob ich meine GetHashCode Methode hier falsch implementiere.

Was habe ich hier vermisst? Warum enthält in meinem Fall immer "Nicht enthalten"? Wie kann ich diese Contains Methode einer Liste korrekt überschreiben?

+0

Nun Ihre Hash-Code mit den Equals nicht übereinstimmt, wie Es sollte dasselbe für zwei gleiche Objekte zurückgeben. Der Hash sollte etwas mehr sein als 'return this.ForeignRelation.GetHashCode() + this.LocalRelation.GetHashCode();' – juharr

Antwort

1

Sie wahrscheinlich tun sollte dies Enumerable.Any() durch den Aufruf, wie folgt aus:

bool contains = myList.Any(t => 
    (t.LocalRelation == passed.LocalRelation && t.ForeignRelation == passed.ForeignRelation) 
    || (t.LocalRelation == passed.ForeignRelation && t.ForeignRelation == passed.LocalRelation) 

Keine Notwendigkeit Equals oder irgendetwas davon außer Kraft zu setzen.

Oder, wenn Sie nicht Enumerable (LINQ) verwenden wollen, gibt es die List.Exists Methode, die Sie in der gleichen Weise nennen:

bool contains = myList.Exists(t => 
    (t.LocalRelation == passed.LocalRelation && t.ForeignRelation == passed.ForeignRelation) 
    || (t.LocalRelation == passed.ForeignRelation && t.ForeignRelation == passed.LocalRelation) 
+0

Dies gibt mir immer noch die gleichen Ergebnisse. Es existiert immer nicht, obwohl es existiert – Jaylen

+0

@Jaylen: Dann gibt es etwas, was du uns nicht sagst. Sie müssen uns ein spezifisches Beispiel liefern, das wir testen können. Wahrscheinlich sollten Sie Ihre Objekte so einfach wie möglich gestalten, damit Sie uns nicht mit Code töten. Weitere Informationen finden Sie unter http://stackoverflow.com/help/mcve. –

+0

Eigentlich habe ich dir die wahre Geschichte erzählt, aber aus irgendeinem Grund '.Any()' funktionierte nicht für mich vom ersten Versuch an. Jetzt hat es getan. Ich glaube, ich habe etwas verpasst. Vielen Dank für Ihre Hilfe. Wäre es ein Grund, einen Weg über den anderen zu wählen? Sind sie identisch? – Jaylen