2009-07-02 9 views
2

Ich habe 2 Sammlungen, eine der verfügbaren Funktionen und eine der Benutzerfunktionen. Ich möchte ein Element in den verfügbaren Features löschen, die den Feature-Code in der anderen Sammlung enthalten, aber die richtige Syntax nicht finden.Vergleichen zweier Sammlungen von Objekten

Ich habe meinen aktuellen Code enthält das nicht, kompiliert (es beschwert, dass ich nicht den „==“ Operator verwenden kann, mein Linq Wissen ist minimal)

Ist Linq der beste Weg, dies zu tun ? Jede Hilfe wäre willkommen.

 AvailableFeatureViewListClass availableFeatures = (AvailableFeatureViewListClass)uxAvailableList.ItemsSource; 
     UserFeatureListClass userFeatures = (UserFeatureListClass)uxUserFeatureList.ItemsSource; 

     foreach (UserFeatureClass feature in userFeatures) 
     { 
      availableFeatures.Remove(availableFeatures.First(FeatureCode => FeatureCode == feature.FeatureCode)); 
     } 

Antwort

5

Verwenden Except Methode mit einem benutzerdefinierten Equals oder IEqualityComparer Implementierung für Ihre Art (die Art Ihres Auflistelement nicht wirklich offensichtlich ist):

var features = availableFeatures.Except(userFeatures, new FeatureCodeComparer()); 

Wenn die availableFeatures nur eine Sammlung von ganzen Zahlen ist, Sie würden nur so etwas wie tun:

var features = availableFeatures.Except(userFeatures.Select(x => x.FeatureCode)); 
+0

Ich versuchte den zweiten Vorschlag und es beschwert sich, dass der "x" -Teil nicht abgeleitet werden kann. Klingt wie es sollte funktionieren, aber die Linq wirft mich gerade jetzt. –

+0

@Mark: Können Sie uns sagen, was die 'AvailableFeatureViewListClass' oder' UserFeatureListClass' Typen sind? Warum benutzen Sie nicht einfach nur generische Typen? –

+0

Danke Mehrdad, sie sind eigentlich beide BusinessObjects, aber die Elemente in der Objektsammlung teilen Eigenschaften (in diesem Fall FeatureCode) –

2

so etwas wie dieses Versuchen:

var features = (from af in availableFeatures select af.FeatureCode) 
      .Intersect(from uf in userFeatures select uf.FeatureCode); 
+0

Danke Andrew, es sieht richtig aus, aber wenn ich versuche, nichts zu binden, kehrt zurück. Ich habe überprüft und die Feature-Variable wird in das IntersectIntegrator-Objekt umgewandelt. Gibt es eine Möglichkeit, diese in eine AvailableFeatureViewList-Klasse zurück zu konvertieren? –

1

Wie wäre es damit?

Verwandte Themen