我目前正在开发一个C#WPF项目。我有一个列表,它使用一个类来存储多个值。该类称为DBTables,内部包含以下内容:
class DBTables
{
public string selDatabase { get; set; }
public string selTable { get; set; }
}
我正在使用以下代码
创建列表的新实例List<DBTables> tableArr = new List<DBTables>();
我正在向List添加新项目而没有任何问题,但我遇到的问题是从列表中删除项目。
如果选中了复选框,则会在列表中添加项目,并且取消选中该复选框时,需要删除该项目。每次选中该复选框时,都会使用以下代码添加两个值:
private void addBackupArray(string table)
{
backupArr.Add(new DBTables
{
selDatabase = selectedDatabase,
selTable = table
});
}
如果取消选中该复选框,则需要删除该位置的值,并且我已经将其工作了但是在删除了该项后,它会显示错误'InvalidOperationException,collection was modified;枚举可能不会执行'。
以下是我目前用于从列表中删除项目的代码。
private void removeBackupArray(string table)
{
int i = 0;
foreach (DBTables tables in backupArr)
{
if (selectedDatabase == tables.selDatabase && table == tables.selTable)
{
backupArr.RemoveAt(i);
i = 0;
}
i++;
}
}
上面的代码遍历列表中的值,并基于if语句判断两个变量是否与列表中找到的值匹配,它会在计数器i的当前位置将其删除。
如何解决此问题,以便我可以删除该项而不会收到错误。
感谢您提供的任何帮助。
答案 0 :(得分:3)
将foreach
更改为正常for
循环将解决问题:
for (int tablesIndex = 0; tablesIndex < backupArr.Count; tablesIndex++)
{
var tables = backupArr[tablesIndex];
if (selectedDatabase == tables.selDatabase && table == tables.selTable)
{
backupArr.RemoveAt(tablesIndex);
tablesIndex--;
}
}
答案 1 :(得分:0)
将您的foreach更改为for循环。 foreach使用枚举器迭代List中的所有对象。您不能在foreach中更改枚举器的内容,否则您将收到错误。
尝试改为尝试
int i;
for (i = 0; i < backupArr.Count; i++)
{
DBTables tables = backupArr[i];
if (selectedDatabase == tables.selDatabase && table == tables.selTable)
{
break;
}
}
backupArr.RemoveAt(i);
答案 2 :(得分:0)
更简洁的解决方案可能是使用像这样的linq:
DBTables tables = backupArr.Where(t => t.selDatabase == selectedDatabase && t.selTable == table).SingleOrDefault();
if (tables != null)
backupArr.Remove(tables);