运行查询后删除每个listbox1项

本文关键字:listbox1 删除 查询 运行 | 更新日期: 2023-09-27 18:25:00

我的listbox1中有一些项,我想使用每个项来运行查询,一旦运行了查询,我想删除listbox中的该项,并使用下一项来运行该查询。例如,如果使用了item1,则删除item1并使用列表框中的下一个项来运行查询。对所有项目执行此操作,直到列表框1中没有剩余项目为止。

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
        {
        } 
    }
}

运行查询后删除每个listbox1项

您不能在foreach循环中直接执行此操作。它会给您一个异常'集合已被修改;如果您尝试在foreach循环中执行枚举操作,则可能不会执行"。相反,在执行完整个查询之后,您可以将它们全部删除。

listBox1.Items.Clear();

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

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

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

与其他人的意见相反,您可以使用foreach循环来删除项目。关键是,在尝试对列表进行迭代之前,您必须对列表进行copy

.ToList()添加到末尾。如果ItemsCollection,则需要使用.OfType<string>().ToList()将其类型转换为正确的类型。

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

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

您不能在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);
}

首先,您不能从foreach循环中的列表中删除项,它在更改集合时引发异常。您应该使用normal 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
                            {
                            } 
                         }
                     }