我的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
{
}
}
}
答案 0 :(得分:1)
您不能直接在foreach循环中执行此操作。它会给你例外'收集被修改;如果您尝试在foreach循环中执行此操作,则枚举操作可能无法执行。而是在执行完整个查询后,您可以将它们全部删除。
listBox1.Items.Clear();
如果您想跟踪已经执行的项目,您可以创建
HashSet<int> ids = new HashSet<int>();
ids.Add(yourIdToAdd);
并在其中添加已执行的ID。
答案 1 :(得分:1)
与其他人的观点相反,您可以使用foreach循环来删除项目。关键是你必须在尝试迭代它之前制作列表的copy
。
将.ToList()
添加到最后。如果Items
是Collection
,那么您需要使用.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
{
}
}
}