J'ai deux collections, contenant chacune environ 40 000 articles.Recherche Linq et binaire - Améliorer cette lente Où l'instruction?
Les éléments de la liste 2 sont liés aux éléments de la liste 1 via une clé étrangère.
Pour chaque élément de la liste un, je veux trouver l'élément correspondant dans la liste deux.
Quelque chose comme ceci:
foreach(var item in list1)
{
var match = list2.Where(child => child.ID == item.ChildID).FirstOrDefault();
item.Child = match;
}
Cela fonctionne, mais il est lent comme l'enfer.
Maintenant, list1 et list 2 sont triés par ces clés à partir de la base de données. Ainsi, list1 est trié par ChildID et list2 est ordonné par ID (même valeur).
Je pense qu'une recherche binaire accélérerait considérablement cela, mais j'ai lu quelque part que Linq choisirait la stratégie la plus appropriée pour la liste dans la clause Where. Peut-être que j'ai besoin de lancer explicitement à une liste triée? Ou peut-être ai-je besoin d'implémenter un algorithme de recherche binaire personnalisé avec un comparateur?
Tous les aperçus sont appréciés.
Merci.
Si les deux listes sont triées, vous pouvez facilement écrire une méthode d'extension pour le faire en temps linéaire - pas besoin de recherche binaire. –
La recherche binaire offre ln (n) temps, ce qui est bien meilleur que n. (ln (40000) = 10, donc l'implémentation de la recherche binaire doit être slooooooooooow pour rattraper ça: =)) – GameAlchemist