从C#</dbtables>中的列表<dbtables>中删除项目

时间:2011-08-07 15:06:54

标签: c# list

我目前正在开发一个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的当前位置将其删除。

如何解决此问题,以便我可以删除该项而不会收到错误。

感谢您提供的任何帮助。

3 个答案:

答案 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);