2013-08-06 4 views
1

Voici l'affaire. J'ai 3 tables.Optimisation de ma fonction de recherche en utilisant foreach() - perfomance

  1. principal (contient ID et une liste de SubMain) ~ 130 articles (après premier filtrage)

  2. SubMain (contient SubMainID) ~ 120 articles (qui a obtenu une référence à m si il y a un autre table)

  3. MainToSub (contient ID, MainID et SubMainID) ~ 500 articles

principal est mon modèle qui im ​​wor roi avec et que je montre dans le GridView. Avec ce foreach je recherche pour chaque partie du modèle qui a SearchSubMainID dedans. Cela fonctionne, mais le problème est que je saute plus de 72000 dans le foreach qui est pas vraiment optimisé

foreach (var item in MainToSub) 
{ 
// 500 Jumps 
    foreach (var temp in Main) 
    { 
     if (item.MainID == temp.ID && item.SubMainID == SearchSubMainID) 
     { 
      Model.Add(temp); 
      // ~ 10 Jumps 
     } 
     // 72000 jumps 
    } 
} 

Question: Y at-il un moyen d'optimiser le foreach?

+0

sry mon erreur. Main a obtenu ~ 130 articles dans le pire des scénarios –

Répondre

1

Eh bien, vous pouvez déplacer l'un des contrôles jusqu'à un foreach:

foreach (var item in MainToSub) 
    if (item.SubMainID == SearchSubMainID) 
     foreach (var temp in Main) 
      if (item.MainID == temp.ID) 
       Model.Add(temp); 

Et ce n'est pas vraiment l'optimisation, mais vous pouvez aussi la transformer en une expression LINQ:

foreach (var temp in MainToSub 
    .Where(i => i.SubMainID == SearchSubMainID) 
    .Join(Main, i => i.MainID, t => t.ID, (i, t) => t)) 
     Model.Add(temp); 
+0

de 72000 à 270. thx –

1

Vous pouvez utiliser un Dictionary, faire votre propre classe pour être utilisé comme une clé contenant le MainID et le SubMainID. Avec ce Dictionary vous n'avez pas besoin de chercher, vous venez de trouver ... un peu.

0

Vous pouvez également sort votre lists et essayer de le rechercher en utilisant BinarySearch - vous avez alors O (log n). Mais la solution avec Dictionary est beaucoup plus simple.

Questions connexes