运行查询后删除每个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
{
}
}
}
您不能在foreach循环中直接执行此操作。它会给您一个异常'集合已被修改;如果您尝试在foreach循环中执行枚举操作,则可能不会执行"。相反,在执行完整个查询之后,您可以将它们全部删除。
listBox1.Items.Clear();
如果你想跟踪已经执行的项目,你可以创建一个
HashSet<int> ids = new HashSet<int>();
ids.Add(yourIdToAdd);
并在其中添加已执行的id。
与其他人的意见相反,您可以使用foreach循环来删除项目。关键是,在尝试对列表进行迭代之前,您必须对列表进行copy
将.ToList()
添加到末尾。如果Items
是Collection
,则需要使用.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
{
}
}
}