如何根据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
相关产品推荐
相关产品推荐

