0

我的 listbox1 中有一些项目,并且想使用每个项目来运行查询,一旦运行查询,我想删除列表框中的那个项目并使用下一个项目来运行查询。例如,如果使用 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
        {

        } 
    }
}
4

4 回答 4

1

与其他人的意见相反,您可以使用 foreach 循环删除项目。关键是你必须copy在尝试遍历它之前制作一个列表。

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

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

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

于 2013-07-25T17:02:36.230 回答
1

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

listBox1.Items.Clear();

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

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

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

于 2013-07-25T16:56:16.510 回答
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);
}
于 2013-07-25T17:00:51.037 回答
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
                            {

                            } 
                         }
                     }
于 2013-07-25T17:03:40.880 回答