在值列表框中添加值,而不使用for循环

时间:2010-02-19 13:25:36

标签: c# collections listbox

我在Windows应用程序中使用了ListBox。我从WCF服务器获得了变量iplist

之后我在ListBox中添加了该列表,但是它生成了一个错误:“集合被修改,枚举可能无法执行”。

我该如何解决这个问题?

我的代码是:

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);
            }
         }
    }
}

3 个答案:

答案 0 :(得分:1)

在迭代集合时,无法添加枚举(在本例中为列表框)。

您可能需要以下内容:

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); 
        }
   } 
}

答案 1 :(得分:0)

你的问题正是詹姆斯所说的,你不能在迭代集合时添加枚举。虽然你也可以用这种方式解决它。 (我假设pc.IPAddress是一个字符串,如果它们是别的,只需切换类型。)

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));
    }
}

答案 2 :(得分:0)

如果你读了你的代码,那可能不是你想要的。 如果IP地址不存在,您想将其添加到列表中吗?

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

您现在所做的是循环显示列表框中的项目。如果某个项目不包含ipaddress,您将其添加到列表框中。 你想要的是当它没有出现在整个列表框中时添加ipaddress。因此:

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