0
votes

Comparez deux listes pour déterminer si les deux listes contiennent les mêmes éléments utilisant des prédicats de Lambda

J'essaie de retourner une valeur booléenne si ma liste d'objets contient tous les types d'une liste de types dans VB.NET ou C #. J'ai du mal à écrire une expression de Lambda pour y accomplir. Cela peut-il être fait en utilisant des prédicats de Lambda? Je sais que cela peut être fait facilement avec un pour chaque boucle.

vb.net xxx

c # xxx

Modifier, merci pour toutes les réponses rapides, je vois qu'il y a quelques façons de le faire, et de mieux comprendre ce qui se passe dans l'expression.


1 commentaires

Et si wlist contient deux éléments avec xtype ? Et quels problèmes avec votre code actuel? Pouvez-vous montrer (en C # pseudo code) ce que vous essayez de faire de la balance?


6 Réponses :


2
votes
var containsAll = typeList.All(type => 
    wList.Any(widget => widget.bearing.Equals(type)));
Translated, it is true for all types in typeList that any (at least one) widget in the list has that type.

6 commentaires

J'essaie de valider que tous les types existent dans la liste, pas seulement.


Oui, c'était ma compréhension. Pour tous les types de type Typelist Il doit y avoir au moins un widget correspondant dans wlist .


Peut-être que je ne le ss pas aussi clairement que possible, mais je veux m'assurer que tous les éléments de la classique correspondent à un élément dans wlist pour que je comparais chaque article dans wluist pour vous assurer qu'il est également dans type type


Dans ce cas, je pense que le nombre de réponses suggère un manque de clarté. "Si ma liste d'objets contient tous les types dans une liste de types." Si wlist contient tous les types de type type type ? C'était ma compréhension.


D'accord, après avoir passé la logique, je vois ce que ça fait maintenant, je pensais qu'à d'abord, c'était juste vérifier si tout l'un des types existait, mais je vois comment il utilise le tout et ensuite le conditionnel


Cette réponse et la réponse Matt.g sont correctes, toutes les autres réponses vérifient la mauvaise route



1
votes

Le plus court est

containsAllTypes =  wList.Select(x => x.bearing).Intersect(typeList).Count() == typeList.Count;


0 commentaires

1
votes
 Dim containsAllTypes As Boolean = wList.All(Function(a) typeList.Any(Function(b) b = a.bearing))
For each value in wList, it checks to see if any values in typeList match the wList bearing value.

0 commentaires

0
votes

Vous pouvez utiliser intersect pour vérifier si les deux liste ont les mêmes valeurs. Essayez ce code xxx

si vous devez avoir hasall == true uniquement si tous les types de wluist ont eu lieu une fois, supprimez l'appel sur < Code> distinct


0 commentaires

3
votes

Essayez var contient tous les types = type list.All (x => list.sélectionnez (x => x.bearing) .Contains (x))


1 commentaires

Cette solution fonctionne également, je pense que la logique est fondamentalement la même utilisation par contenant ou comme dans la réponse de Scott Hannen à l'aide de n'importe quel tant qu'il est préfixé avec le prédicat alors vérifie chacun.



2
votes

Je crois ce que vous voulez, c'est ce qui suit: xxx pré>

Vous pouvez également utiliser System.Linq comme suit: P>

bool containsAllTypes2 = wList.All(a => typeList.Any(b => b == a.bearing));


0 commentaires