2010-02-19 7 views
1

J'ai utilisé un ListBox dans mon application Windows. J'ai la variable iplist à partir d'un serveur WCF. Après que j'ai ajouté cette liste dans ma ListBox, mais il a généré une erreur: "Collections modifiées, l'énumération ne peut pas exécuter".Ajouter une valeur dans la liste à partir de la liste des valeurs sans utiliser pour la boucle

Comment puis-je résoudre ce problème?

Mon code est:

foreach (ClsPC pc in iclsobj.GetPC()) 
{ 
    if (listBox1.Items.Count == 0) 
    { 
     listBox1.Items.Add(pc.IPAddress); 
    } 
    else 
    { 
     for (int i = 0; i < listBox1.Items.Count; i++) 
     { 
      if (!listBox1.Items[i].ToString().Contains(pc.IPAddress)) 
      { 
       listBox1.Items.Add(pc.IPAddress); 
      } 
     } 
    } 
} 

Répondre

1

Vous ne pouvez pas ajouter à une énumération, dans ce cas, votre zone de liste, tandis que vous itérez la collection.

Vous voulez probablement quelque chose comme:

using System.Linq; 
... 

foreach (ClsPC pc in iclsobj.GetPC()) 
{  
    if (listBox1.Items.Count == 0) 
    { 
     listBox1.Items.Add(pc.IPAddress); 
    } 
    else 
    { 
     if (!listBox1.Items.Any(i => String.Compare(i.ToString(), pc.IPAddress, true) == 0)) 
     { 
      listBox1.Items.Add(pc.IPAddress); 
     } 
    } 
} 
+0

if (! ListBox1.Items.Any (i => String.Compare (i.ToString(), pc.IPAddress, true) == 0)) { Dans cette ligne i get na pas Listbox1.Items.Any option de fonction ... maintenant comment dois-je ajouter les valeurs dans la zone de liste – Suryakavitha

+0

Vous devez ajouter une référence à System.Linq et ajouter une utilisation à votre unité de code. Voir l'exemple de mise à jour – James

0

Votre problème est exactement ce que dit James, vous ne pouvez pas ajouter à une énumération en itérer sur la collection. Bien que vous puissiez également le résoudre de cette manière. (Je suppose que pc.IPAddress est une chaîne, si elles sont quelque chose d'autre, juste changer le type.)

foreach (ClsPC pc in iclsobj.GetPC()) 
{ 
    if (listBox1.Items.Count == 0) 
    { 
     listBox1.Items.Add(pc.IPAddress); 
    } 
    else 
    { 
     var toAdd = new List<string>(); 
     for (int i = 0; i < listBox1.Items.Count; i++) 
     { 
      if (!listBox1.Items[i].ToString().Contains(pc.IPAddress)) 
      { 
       toAdd.Add(pc.IPAddress); 
      } 
     } 
     toAdd.ForEach(item => listBox1.Items.Add(item)); 
    } 
} 
+0

@wasatz, la question dit 'sans utiliser pour la boucle ' – James

+0

Merde! J'ai totalement raté ça. D'accord, dans ce cas, mon code est complètement hors de propos. Désolé pour ça. – wasatz

0

Si vous lisez votre code, il est probablement pas ce que vous voulez. Vous voulez ajouter l'adresse IP à la liste si elle n'existe pas?

for (int i = 0; i < listBox1.Items.Count; i++) 
{ 
if (!listBox1.Items[i].ToString().Contains(pc.IPAddress)) 
{ 
    listBox1.Items.Add(pc.IPAddress); 
} 
} 

Ce que vous faites est maintenant en boucle sur les éléments dans la zone de liste. Si un élément ne contient pas l'adresse IP, vous l'ajouterez à la liste. Ce que vous voulez, c'est ajouter l'adresse ipad quand elle ne se trouve pas dans toute la liste. Par conséquent:

//IPAddress is a string? 
if (!listBox1.Items.Contains(pc.IPAddress)) 
{ 
listBox1.Items.Add(pc.IPAddress); 
} 
Questions connexes