"sauter par dessus" un foreach??

immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008 - 13 févr. 2006 à 19:17
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 18 févr. 2006 à 08:53
Bonjour!
j'ai de nouveau un petit problème, mais j'avoue, celui-là, je sais plus quoi faire : est ce qu'il pourrait y avoir une raison pour que le programme ignore une énumération foreach?
Je m'explique : j'ai une boucle foreach qui énumère les éléments d'une ArrayList.Synchronized (encore et toujours :p), elle même dans une boucle infinie, et dans un bloc d'instructions conditionnelles. Les éléments de l'ArrayList sont susceptibles d'être modifiées à chaque boucle.
A chaque fois que j'arrive à cet endroit du programme, j'obtiens un résultat aberrant. Je me suis penché sur le code, et, ne trouvant rien, j'ai mis des points d'arrêt aux endroits stratégiques et j'ai exécuté le programme. Surprise : la première fois que la condition est vérifiée, tout se passe bien, j'arrive au point d'arrêt foreach. Mais les fois suivantes, le programme fait comme s'il ignorait l'instruction, et le programme se bloque.

Avez vous déjà rencontré ce genre de problèmes? Est-ce une restriction des ArrayList?
J'espère que quelqu'un pourra me donner une réponse, je n'ai rien trouvé qui ressemble à ce problème...

Merci d'avance

Immerczeck

10 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
13 févr. 2006 à 19:23
Salut,

Si l'execution du code du corps de l'instruction foreach ne se fait pas, c'est que la collection est probablement vide.

/*
coq
MVP Visual C#
*/
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
13 févr. 2006 à 19:27
ce n'est pas le corps de l'instruction foreach qui ne s'exécute pas, c'est l'instruction foreach (enfin sauf si, lorsque je mets un point d'arrêt à la ligne du foreach, il pointe sur le corps)
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
13 févr. 2006 à 19:30
pardon j'ai oublié de dire que le thread s'arrête après cela, j'ai mis un autre point d'arrêt après les instructions conditionnelles et le programme ne s'y arrête plus passée la première boucle.
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
13 févr. 2006 à 19:36
ha ui heu tout cela sert à vérifier si l'ArrayList ne contient pas un objet dont l'une des propriétés est égale à une valeur.(je ne sais pas si je m'exprime correctement). Je teste donc dans le foreach si cl.name=="valeur".
S'il existe un moyen simple de tester directement la présence de la chaîne dans les propriétés des éléments de l'arraylist, ce serait aussi bien, mais je n'ai trouvé que la méthode Contains, qui traite l'objet entier.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
13 févr. 2006 à 22:43
Une solution serait d'implémenter ta propre classe de collection fortement typée et de traiter le test de cette propriété dans l'implémentation de ta méthode Contains.
En gros tu déplaces ta boucle :-)
La seule différence étant que tu feras un seul appel de méthode au lieu de c/c ta boucle si tu viens à maintenir une autre liste de clients (c'est bien ça ?) dans ton programme.

/*
coq
MVP Visual C#
*/
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
17 févr. 2006 à 19:24
merci de ta réponse coq!
désolé pour ma longue absence, de graves pb d'ordi... :p
sinon, est ce que tu pourrais me donner un exemple? Je sais je sais mais je débute :p
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
17 févr. 2006 à 21:59
en fait le problème ne concernait absolument pas le foreach ;) apparemment cela concerne une instruction receive qui fait planter tout le programme... je vais essayer de faire dans l'asynchrone pour régler ça, mais j'ai encore jamais fait, alors je sais pas si ça va donner quelque chose
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
17 févr. 2006 à 22:25
Je parlais de quelquechose de ce genre :

public class ClientCollection : CollectionBase
{
public ClientCollection()
{
}


public int Add(Client cl)
{
return base.InnerList.Add(cl);
}


public void Remove(Client cl)
{
base.InnerList.Remove(cl);
}


public Client this[int index]
{
get
{
return base.InnerList[index] as Client;
}
}


public Client this[string name]
{
get
{
for ( int i=0; i


return null;
}
}


public bool Contains(Client cl)
{
return base.InnerList.Contains(cl);
}


public bool Contains(string name)
{
for ( int i=0; i


return false;
}
}

/*
coq
MVP Visual C#
*/
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
18 févr. 2006 à 00:17
merci pour le code coq!!
sinon, aurais-tu une idée de la raison pour laquelle un Receive peut se bloquer en attente? comme si la socket était occupée ou quelque chose de ce genre...car c'est cela qui faisait en réalité planter mon programme, et je préfère ne pas poser un autre sujet pour ne pas encombrer le forum
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
18 févr. 2006 à 08:53
0
Rejoignez-nous