De vérifier tout élément qui existe dans les deux collections
Je me demandais si Linq a une méthode pour vérifier si les deux collections ont au moins un élément en commun. Je m'attends à quelque chose comme ceci:
var listA = new List<int>() { some numbers };
var listB = new List<int>() { some numbers, potentially also in list A };
bool hasSameElements = listA.hasMatchingElements(listB);
N'existe dans Linq ou devrais-je écrire une méthode personnalisée pour elle?
Je suis conscient de la méthode Intersect, mais n'est-ce pas le rendement de l'ensemble de l'intersection de l'ensemble? Je suis seulement intéressé à vérifier SI les deux de la collection se croisent, donnant l'ensemble semble comme un gaspillage, en particulier sur les plus grandes collections.
Intersect
seulement donne autant d'éléments qu'il est demandé. Si vous le suivez avecAny
, ouFirstOrDefault
, ou faire unforeach
et de briser à la première itération, elle ne pourra trouver le premier élément qui existe dans les deux listes (le cas échéant) - il ne vous embêtez pas à trouver le repos.- Howver, notez que le
Intersect
opération requiert l'un de la deux séquences à lire complètement avant de le premier élément peut être cédé. Si l'un de vos entrées est à l'infini, assurez-vous que ce n'est pas l'entrée qui est complètement consommé. Notez que le spec pourIntersect
des mensonges au sujet de la façon dont il fonctionne.
Vous devez vous connecter pour publier un commentaire.
Sons comme vous voulez juste:
EDIT: Comme indiqué dans les commentaires,
Intersect
utilise évaluation différée. Il reporte tous exécution jusqu'à ce que le premier élément est lu à partir du résultat; à ce stade, il va charger tous delistB
dans un ensemble, et ensuite diffuserlistA
jusqu'à ce qu'il trouve un résultat de rendement. À ce point,Any()
sera de retourtrue
et donc plus les travaux seront effectués. Voir mon Edulinq post surIntersect
pour plus d'informations.int
s, que si les deux listes contiennent un0
?Any
s'arrêtera dès qu'un seul élément est retourné (sauf si l'ensemble n'a pas d'éléments) et se Croisent utilise l'exécution différée, de sorte qu'il va cracher de chaque élément comme il s'agit à travers elle. Ce sera assez performant.listA.Intersect(listB)
oulistB.Intersect(listA)
trop.)