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

如何根据DataRow数组筛选DataTable:移除日期匹配ID不匹配的行

解决DataTable移除指定日期组中ID不同行的问题

我来帮你搞定这个DataTable的行移除需求!核心要做的就是:从现有DataTable里删掉那些日期范围(startdate+enddate)和目标DataRow数组里某一行完全相同,但ID不匹配的行。下面是具体的思路和代码实现:

具体步骤与C#代码实现

咱们先把目标数组里的「日期范围-允许保留的ID」关系整理成可快速查询的结构,再筛选出DataTable里不符合条件的行批量删除(避免遍历直接删除导致的枚举错误):

using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;

// 假设你已经有了原DataTable dt 和目标DataRow数组 targetRows
var dateIdMap = new Dictionary<Tuple<DateTime, DateTime>, List<int>>();

// 第一步:把目标数组的日期范围和对应ID整理成字典,方便快速匹配
foreach (DataRow targetRow in targetRows)
{
    // 用ParseExact解析日期,避免系统区域格式差异导致的错误(原数据是MM/dd/yyyy格式)
    DateTime startDate = DateTime.ParseExact(targetRow["startdate"].ToString(), "MM/dd/yyyy", CultureInfo.InvariantCulture);
    DateTime endDate = DateTime.ParseExact(targetRow["enddate"].ToString(), "MM/dd/yyyy", CultureInfo.InvariantCulture);
    int targetId = Convert.ToInt32(targetRow["ID"]);
    
    var dateKey = Tuple.Create(startDate, endDate);
    if (!dateIdMap.ContainsKey(dateKey))
    {
        dateIdMap.Add(dateKey, new List<int>());
    }
    dateIdMap[dateKey].Add(targetId);
}

// 第二步:收集所有需要删除的行(不能直接遍历DataTable时删除,会触发枚举异常)
List<DataRow> rowsToRemove = new List<DataRow>();
foreach (DataRow tableRow in dt.Rows)
{
    DateTime rowStart = DateTime.ParseExact(tableRow["startdate"].ToString(), "MM/dd/yyyy", CultureInfo.InvariantCulture);
    DateTime rowEnd = DateTime.ParseExact(tableRow["enddate"].ToString(), "MM/dd/yyyy", CultureInfo.InvariantCulture);
    var rowDateKey = Tuple.Create(rowStart, rowEnd);
    int rowId = Convert.ToInt32(tableRow["ID"]);
    
    // 判断规则:日期范围在目标字典中,且当前行ID不在允许保留的列表里,标记删除
    if (dateIdMap.ContainsKey(rowDateKey) && !dateIdMap[rowDateKey].Contains(rowId))
    {
        rowsToRemove.Add(tableRow);
    }
}

// 第三步:批量删除标记的行
foreach (DataRow row in rowsToRemove)
{
    dt.Rows.Remove(row);
}

针对你给出的示例数据的效果

原DataTable里的行处理后:

  • ID2(03/26-03/27):和目标数组行匹配,保留
  • ID56(03/26-03/27):日期匹配但ID不同,被删除
  • ID88、ID14(03/27-03/28):日期和目标数组里ID25的行匹配,但ID不匹配,被删除

最终DataTable只会剩下ID2的那一行,完全符合需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:48:05