2009-07-02 8 views
2

J'ai deux collections, l'une des fonctions disponibles et l'autre des fonctions utilisateur. Je voudrais supprimer un élément dans les fonctionnalités disponibles qui contiennent le featurecode dans l'autre collection, mais ne trouve pas la bonne syntaxe.Comparaison de deux collections d'objets

J'ai inclus mon code actuel qui ne compile pas (il se plaint que je ne peux pas utiliser le « == » opérateur, ma connaissance Linq est minime)

est-Linq la meilleure façon de faire ? Toute aide serait appréciée.

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

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

Répondre

5

Utilisez méthode Except avec une coutume Equals ou IEqualityComparer mise en œuvre pour votre type (le type de votre élément de collection n'est pas vraiment évident):

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

Si le availableFeatures est juste une collection d'entiers, vous devriez juste faire quelque chose comme:

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

J'ai essayé la deuxième suggestion et il se plaint que la partie "x" ne peut pas être déduite. On dirait que ça devrait marcher mais le Linq me lance maintenant. –

+0

@Mark: Pourriez-vous nous dire ce que sont les types 'AvailableFeatureViewListClass' ou' UserFeatureListClass'? Pourquoi n'utilisez-vous pas simplement des types génériques directement? –

+0

Merci Mehrdad, ils sont en fait deux BusinessObjects, mais les éléments dans la collection d'objets partagent des propriétés (dans ce cas, FeatureCode) –

2

Essayez quelque chose comme ceci:

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

Merci Andrew, il semble à droite, mais quand j'essaye de lier rien ne retourne. J'ai vérifié et la variable features est castée en l'objet IntersectIntegrator, est-il possible de convertir cela en une classe de AvailableFeatureViewList? –

1

Que pensez-vous de cela?

IEnumerable<int> a = new List<int>() { 1, 2 }; 
    IEnumerable<int> b = new List<int> { 2, 3 }; 

    var result = a.Except(b); 
    a = result;