You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataTable与ListBox数据同步需求及现有实现问题咨询

解决方案:高效更新DataTable以匹配ListBox内容

首先,你的核心思路方向是对的,但现有实现存在两个可以优化的点:一是嵌套循环的查找效率偏低,二是直接依赖行索引后续删除时容易出现索引偏移(因为删除行后剩余行的索引会自动变化)。下面是更简洁、可靠的实现方案:

步骤分解

  • 先把ListBox中的所有项文本存入HashSet,这样可以以O(1)的时间复杂度快速判断是否存在,大幅提升查找效率
  • 批量删除DataTable中不在ListBox里的记录(注意要避免遍历过程中直接修改集合)
  • 找出ListBox中不在DataTable里的新增项,添加为新的DataRow

完整代码实现

// 获取原始DataTable
DataTable dtTable = GetImpactedTestCaseDetailsToUpdateStatus().Tables[0];

// 1. 提取ListBox所有项文本到HashSet,方便快速查找
HashSet<string> listBoxItems = new HashSet<string>();
foreach (ListItem item in ListBox1.Items)
{
    listBoxItems.Add(item.Text);
}

// 2. 批量删除DataTable中不匹配的记录
// 注意:要倒序遍历Rows,避免正序遍历删除时索引错乱
for (int i = dtTable.Rows.Count - 1; i >= 0; i--)
{
    string testCaseName = dtTable.Rows[i]["TestCaseName"].ToString();
    if (!listBoxItems.Contains(testCaseName))
    {
        dtTable.Rows.RemoveAt(i);
    }
}

// 3. 添加ListBox中的新增记录(即不在原始DataTable中的项)
// 先提取当前DataTable中已有的TestCaseName集合
HashSet<string> existingTestCases = new HashSet<string>();
foreach (DataRow row in dtTable.Rows)
{
    existingTestCases.Add(row["TestCaseName"].ToString());
}

// 遍历ListBox,添加不存在的项
foreach (ListItem item in ListBox1.Items)
{
    string testCaseName = item.Text;
    if (!existingTestCases.Contains(testCaseName))
    {
        DataRow newRow = dtTable.NewRow();
        newRow["TestCaseName"] = testCaseName;
        // 如果还有其他列需要赋值,在这里补充
        // newRow["OtherColumn"] = value;
        dtTable.Rows.Add(newRow);
    }
}

对原有代码的优化说明

  • 效率提升:用HashSet替代嵌套循环,查找复杂度从O(n*m)降到O(n+m),数据量越大优势越明显
  • 避免索引偏移:倒序遍历删除行,不会因为前面行删除导致后面行的索引错位
  • 逻辑清晰:拆分删除和新增两个独立步骤,代码更易维护和调试

如果你需要处理其他列的赋值,只需要在新增行的部分补充对应的列值即可。

内容的提问来源于stack exchange,提问作者prashanat chaudhari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:51