2010-11-25 3 views
1

J'ai deux IEnumerable<string> qui représentent des listes de chaînes. Je veux voir si un élément du premier ensemble correspond à un élément du second ensemble. En ce moment j'ai quelque chose qui ressemble à ceci:Identifier efficacement si un élément du premier ensemble correspond à un élément du deuxième ensemble

firstSet.Intersect(secondSet).Count() > 0 

Cependant, il me semble être plutôt inefficace, car elle produira une liste des éléments qui correspondent, puis les compter. Je peux ensuite tester pour voir si le compte est supérieur à zéro. Je ne me soucie pas de savoir quel match, combien de match, juste que n'importe quel élément dans les deux ensembles correspondent. Y a-t-il quelque chose comme firstSet.AnyMatch(secondSet) qui me manque?

Existe-t-il un moyen plus efficace d'exprimer cela?

Répondre

3

Utilisation Any à la place:

if (firstSet.Intersect(secondSet).Any()) 

Je crois que cela va construire du jeu de hachage de la secondes collection premier (dans son intégralité) et itérer puis sur le premier jeu jusqu'à ce qu'il trouve une correspondance ou s'écoule d'éléments à tester. Vous voudrez peut-être garder cela à l'esprit lorsque vous travaillerez pour mettre firstSet et secondSet.

EDIT: Il suffit de répéter ce qui est déjà dans un commentaire ... si vous savez que (par exemple) firstSet est un HashSet<string> alors vous devriez et à jeté utiliser Overlaps:

HashSet<string> firstHashSet = (HashSet<string>) firstSet; 
if (firstHashSet.Overlaps(secondSet)) 
{ 
    ... 
} 
+0

Serait-il correct de supposer que si le type sous-jacent était déjà un HashSet qu'il ne le reconstruirait pas? –

+0

@Colin: Je ne sais pas si c'est optimisé pour ça. Si vous * savez * que l'un d'entre eux est un 'HashSet ' alors vous devriez lancer un cast et appeler 'HashSet .Overlaps'. –

+0

C'est fantastique. Merci. –

Questions connexes