2009-07-25 8 views
0

Dans le code suivant, j'utilise 3 instructions foreach. Je cherche juste à remplir une liste quand une liste d'éléments correspond à une autre mais ceux qui ne correspondent pas doivent aussi être ajoutés. Alors je me demandais s'il y avait un moyen plus facile de faire ce qui suit.C# recherche dans les listes

 List<T> ds = new List<T>(); //is populated   
     foreach (var b in template.Bs) 
     { 
      List<BD> tempList = new List<BD>(); 
      foreach (BD bd in b.BDs) 
      { 
       Boolean found = false; 
       foreach (DV dv in items) 
       { 
        if (bd.C == dv.C) 
        { 
         found = true; 
         tempList.Add(new BD() 
         { 
          //populating 
         }); 
        } 
       } 
       if (!found) 
        tempList.Add(new BD() 
        { 
         //populating 
        }); 
      } 

     } 
+0

Pouvez-vous utiliser LINQ? –

+0

Cela aiderait si vous avez posté le code réel avec lequel vous voulez de l'aide ... ce fragment remplit 'tempList' qui est local à la boucle foreach externe, donc efficacement, la boucle externe n'atteint vraiment rien! – jerryjvl

+0

La boucle externe traverse les différents groupes de listes. La boucle suivante traverse cette liste. La boucle suivante, boucle sur une liste qui tente de faire correspondre et de transmettre des données à la nouvelle liste créée, mais elle doit toujours gérer la liste 2 foreach. donc les documents qui ne correspondent pas plus ceux qui correspondent à la boucle foreach interne. Voyez-vous où cela devient compliqué? – Bruce227

Répondre

6

La relation entre ds et tempList n'est pas clair, mais il me semble que vos boucles internes sont vraiment une jointure externe gauche:

List<T> ds = new List<T>(); //is populated   
foreach (var b in template.Bs) 
{ 
    var newBDs = from bd in b.BDs 
       join dv in items on bd.C equals dv.C into j 
       from dv in j.DefaultIfEmpty() 
       select dv == null ? NoMatch(bd) : Match(bd, dv); 

    List<BD> tempList = newBDs.ToList(); 

    // Do something with tempList 
} 

Pour chaque b dans template.Bs, nous sommes correspondant bd est de b.BDs avec dv est dans items. Nous utilisons ensuite DefaultIfEmpty() pour mettre null en dv s'il n'y avait pas de correspondance, que nous utilisons ensuite pour déterminer la méthode de projection pour appeler: NoMatch() créerait une nouvelle BD sur la base bd inégalée et Match() créerait un nouveau BD basé sur la correspondance bd et dv.

Cette requête entière est représentée par newBDs, qui sera IEnumerable<BD>. Nous pouvons ensuite tamponner cette séquence en tempList ou faire quelque chose d'utile avec elle.

+0

Ah, c'est ce que je cherchais. Merci beaucoup!!! – Bruce227

+0

J'ai implémenté ça et ça marche parfaitement! Merci encore, beaucoup! – Bruce227

Questions connexes