2016-04-25 9 views
1

Ich habe diese KlasseWie Kreuzung von zwei Klassen zu erhalten, basierend auf Eigenschaft

public class FlightSegment{ 
    public string ClassName { get;set;} 
} 

Und ich will FlightSegments mit gemeinsamen ClassName

void Main() 
{ 
    var list1 = new List<FlightSegment>() { 
     new FlightSegment{ ClassName = "A"}, 
     new FlightSegment { ClassName = "B"} 
    };  
    var list2 = new List<FlightSegment>() { 
     new FlightSegment{ ClassName = "B"}, 
     new FlightSegment { ClassName = "C"} 
    }; 

    var listOfLists = new List<List<FlightSegment>>() { list1, list2 };  
    var intersection = listOfLists.Aggregate((previousList, nextList) => previousList.Intersect(nextList).ToList());   
    Console.WriteLine(intersection); //Gives me empty result 

} 

zu bekommen habe ich versucht, so etwas wie diese:

var intersection = listOfLists.Aggregate((previousList, nextList) => 
     previousList.Select(e=>e.ClassName).Intersect(nextList.Select(e=>e.ClassName)).ToList()); 

Aber gibt Fehler:

Cannot convert expression type System.Collection.Generic.List<string> to return type System.Collection.Generic.List<FlightSegment> 

Antwort

4

Sie Intersect Methode Führen ein IEqualityComparer können nach ClassName Eigenschaft vergleichen:

class FlightComparer : EqualityComparer<FlightSegment> 
{ 
    public override bool Equals(FlightSegment x, FlightSegment y) 
    { 
     return x.ClassName == y.ClassName; 
    } 

    public override int GetHashCode(FlightSegment obj) 
    { 
     return obj.ClassName.GetHashCode(); 
    } 
} 

Dann stellen Sie den Schnittpunkt mit diesem Vergleich:

var list1 = new List<FlightSegment>() { 
    new FlightSegment{ ClassName = "A"}, 
    new FlightSegment { ClassName = "B"} 
};  
var list2 = new List<FlightSegment>() { 
    new FlightSegment{ ClassName = "B"}, 
    new FlightSegment { ClassName = "C"} 
}; 
var result = list1.Intersect(list2, new FlightComparer()); 

Dies gibt eine Auflistung nur enthält, ein Element FlightSegment { ClassName = "B" }.

Mit dieser Idee und Aggregate, können Sie die Schnittstelle zwischen einer Gruppe von Listen erhalten auf einem Grundstück basiert:

var intersection = listOfLists.Aggregate((previousList, nextList) => previousList.Intersect(nextList, new FlightComparer()).ToList()); 
+1

Nizza Antwort. Beachten Sie die Anleitung in der Dokumentation: "Wir empfehlen, dass Sie von der Klasse EqualityComparer ' ableiten, anstatt die Schnittstelle 'IEqualityComparer ' zu implementieren, da die Klasse' EqualityComparer 'auf Gleichheit prüft, indem Sie die Methode 'IEquatable .Equals' verwenden die 'Object.Equals' Methode." –

+0

@JimMischel: Danke, ich werde meine Antwort aktualisieren. –

+0

Gut zu wissen, ob er EqualityComparer erbt, wenn er IEqualityComparer implementiert . – jKlaus

Verwandte Themen