【问题标题】:Removing Item from List<DBTables> in C# [duplicate]从 C# 中的 List<DBTables> 中删除项目 [重复]
【发布时间】:2011-10-21 20:41:36
【问题描述】:

我目前正在开发一个 C# WPF 项目。我有一个列表,它使用一个类来存储多个值。该类称为 DBTables,内部有以下内容:

class DBTables
{
 public string selDatabase { get; set; }
 public string selTable { get; set; }
}

我正在使用以下代码创建列表的新实例

List<DBTables> tableArr = new List<DBTables>();

我将新项目添加到列表中没有任何问题,但我遇到的问题是从列表中删除项目时。

当一个复选框被选中时,项目被添加到列表中,当复选框被取消选中时,项目需要被删除。每次选中复选框时,都会使用以下代码添加两个值:

private void addBackupArray(string table)
{
    backupArr.Add(new DBTables
    {
        selDatabase = selectedDatabase,
        selTable = table
    });
}

当未选中该复选框时,需要删除该位置的值,并且我已经让它工作了,但是在它删除该项目后,它会显示错误“InvalidOperationException,集合已修改;枚举可能无法执行'。

以下是我目前用于从列表中删除项目的代码。

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 的当前位置删除它。

我怎样才能解决这个问题,这样我才能在不出现错误的情况下删除项目。

感谢您提供的任何帮助。

【问题讨论】:

    标签: c# list


    【解决方案1】:

    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--;
        }
    }
    

    【讨论】:

    • 当我尝试它时出现一个编译错误,说它需要一个分号 (;)
    • 只是想补充一点,foreach是一个只读循环,应该用于读取值而不是修改它。
    • @Boardy:我添加了一个代码 sn-p 检查它。
    • 感谢 for 和 foreach 循环对新手的帮助很大
    • 为什么在删除项目后将i 重置为0?如果有更多符合条件的项目,这将失败。
    【解决方案2】:

    更简洁的解决方案可能是像这样使用 linq:

            DBTables tables = backupArr.Where(t => t.selDatabase == selectedDatabase && t.selTable == table).SingleOrDefault();
            if (tables != null)
                backupArr.Remove(tables);
    

    【讨论】:

      【解决方案3】:

      将您的 foreach 更改为 for 循环。 foreach 使用枚举器遍历列表中的所有对象。您不能在 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);
      

      【讨论】:

        猜你喜欢
        • 2012-09-28
        • 1970-01-01
        • 2014-11-11
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        • 2012-03-07
        相关资源
        最近更新 更多