2012-04-30 6 views
1

Où as Je pense que cela est une question d'exécution defered, mais peut-être que je manque un peu le pointsur une collection itérer

J'ai une boucle ainsi

List<int> processed = new List<int>() 
foreach(KeyValuePair<int,bool> tbl1 in tables.Where(z=>!processed.Contains(z.Key))){ 
    //do some stuff...etc 
    processed.Add(someInt); 
} 

Je me sens ce qui est très dangereux, mais en réalité l'exécution différée fait-elle ce travail? il semble effectivement être itératif je dis un peu doucement «comme prévu» mais .... question est je suppose que probablement c'est une mauvaise idée, normalement jouer avec une collection que vous itérez sur est MAUVAIS ..

pensées? grâce

ok être clair .. la question est

disent tables est rempli comme celui-ci

1, vrai 2, faux 3, faux 4, faux 5, faux 6, faux

premier tour, je reçois le {1, true} dans tbl1 et ajouter disons 2 à la liste traitée sur le deuxième tour j'obtiendrais {3, false} dans le tbl1 puis ajouter 3 et 4 dans le traitement 3ème tour je voudrais obtenir {5, faux} dans tbl1 est-ce prévu?

Si je sur le tour 4 a ajouté 6 à traité aurais-je {5, false} à nouveau sur le tour suivant? est à nouveau ce devrait Je suppose que je trouve cela un peu confus et je sens sa dangereuse, mais peut-être qui est juste pour moi - comme pas tout à fait donner un sens

n

+0

Je pense que votre instinct que c'est mauvais est bon :-) Cela devrait fonctionner cependant. –

Répondre

3

Comme vous itérer sur tables il sera toujours interroger les il fera courant contenu processed... donc ce que vous voulez, mais pas comment je vous suggère de le faire :)

En dehors de toute autre chose, vous pouvez utiliser HashSet<int> pour éviter un O (n) contrôle de confinement à chaque itération.

Cependant, je pense que vous voulez que la fonctionnalité de DistinctBy dans MoreLINQ:

foreach (var item in tables.DistinctBy(x => x.Key)) 
{ 
    // Process the item 
} 

Cela ne vous laissera pas une liste de clés traitées, il est vrai ... mais peut-être ce n'est pas un problème.

Personnellement, je pense qu'il est dommage que LINQ n'a pas déjà DistinctBy, MaxBy etc, mais nous allons ...

0

Would groupant vos tables vous aider? En fonction de vos projets, vous pouvez commander les groupes en interne. Ou est-ce que je me suis trompé?

0

Je pense que votre instinct qu'il est mauvais est correct :-)

Il devrait fonctionner bien.

La fonction where donne des résultats en les comparant de sorte qu'à chaque itération, elle exécute le lambda et vérifie si la clé est dans la liste.

Vous devriez également changer cette liste en HashSet pour des performances.