"sauter par dessus" un foreach??

Signaler
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
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

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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#
*/
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

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)
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

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.
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

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.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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#
*/
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

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
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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#
*/
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97