运行查询后删除每个listbox1项?

时间:2013-07-25 16:50:42

标签: c# listbox

我的listbox1中有一些项目,并希望使用每个项目来运行查询,一旦运行查询,我想删除列表框中的项目并使用下一项来运行查询。例如,如果使用item1而不是删除item1并使用listbox中的下一个项来运行查询。对所有项目执行此操作,直到listbox1中没有项目。

foreach (string myItems in listBox1.Items)
{
    using (OracleCommand crtCommand = new OracleCommand(select REGEXP_REPLACE(dbms_metadata.get_ddl('" + myItems + "'), conn1))
    {
        string expectedresult = "y";
        string dataresult = crtCommand.ExecuteScalar().ToString();
        if (expectedresult == dataresult)
        {
            //do something and remove the item that has been used to run the query.                                   
        }
        else
        {

        } 
    }
}

4 个答案:

答案 0 :(得分:1)

您不能直接在foreach循环中执行此操作。它会给你例外'收集被修改;如果您尝试在foreach循环中执行此操作,则枚举操作可能无法执行。而是在执行完整个查询后,您可以将它们全部删除。

listBox1.Items.Clear();

如果您想跟踪已经执行的项目,您可以创建

HashSet<int> ids = new HashSet<int>();
ids.Add(yourIdToAdd); 

并在其中添加已执行的ID。

答案 1 :(得分:1)

与其他人的观点相反,您可以使用foreach循环来删除项目。关键是你必须在尝试迭代它之前制作列表的copy

.ToList()添加到最后。如果ItemsCollection,那么您需要使用.OfType<string>().ToList()将其类型化为正确的类型。

foreach (string myItems in listBox1.Items.OfType<string>().ToList())
{
    ....
}

现在,您可以自由删除listBox.Items中的项目,而无需更改正在迭代的列表。

答案 2 :(得分:0)

你不能在foreach中进行内联删除,因为当你试图迭代它时你会修改列表。我会跟踪你要删除的索引,然后在单独的调用中执行。类似的东西:

List<int> removeIndexes = new List<int>();
int i = 0;
foreach (string myItems in listBox1.Items)
                {
                    using (OracleCommand crtCommand = new OracleCommand(select REGEXP_REPLACE(dbms_metadata.get_ddl('" + myItems + "'), conn1))
                    {
                        string expectedresult = "y";
                        string dataresult = crtCommand.ExecuteScalar().ToString();
                        if (expectedresult == dataresult)
                        {
                          //do something and remove the item that has been used to run the query.                    
                          removeIndexes.add(i);               
                        }
                        else
                        {

                        } 
                     }
                     i++;
                 }

foreach (int index in removeIndexes)
{
    listBox1.Items.RemoveAt(index);
}

答案 3 :(得分:0)

首先,您无法从foreach循环中的列表中删除项目,它会在更改集合时引发异常。 你应该使用普通的for循环。您的代码应该类似于:

  for (int i = listBox1.Items.Count -1; i>=0; i--)
      {
            string myItems = listBox1.Items[i];
            using (OracleCommand crtCommand = new OracleCommand(select REGEXP_REPLACE(dbms_metadata.get_ddl('" + myItems + "'), conn1))
                        {
                            string expectedresult = "y";
                            string dataresult = crtCommand.ExecuteScalar().ToString();
                            if (expectedresult == dataresult)
                            {
                               listBox1.RemoveAt(i);
                           }
                            else
                            {

                            } 
                         }
                     }