c# - c#根据条件删除旧的重复数据表
问题描述
我有一个重复行的 DataTable。行相等,但日期不同,并且有些列没有插入日期。我需要删除较旧的重复项并删除未插入日期的重复项。我有以下代码,但它不起作用,因为它无法将字段转换DateTime
为进行比较。
public DataTable RemoveDuplicateRows(DataTable dTable, string colName)
{
Hashtable hTable = new Hashtable();
ArrayList duplicateList = new ArrayList();
//Add list of all the unique item value to hashtable, which stores
combination of key, value pair.
//And add duplicate item value in arraylist.
foreach (DataRow drow in dTable.Rows)
{
foreach (DataRow drow2 in dTable.Rows)
{
if (hTable.Contains(drow[colName]))
{
if (DateTime.TryParse(drow["date"].ToString(), out DateTime res))
{
if (Convert.ToDateTime(drow["date"])<Convert.ToDateTime(drow2["date"]))
{
duplicateList.Add(drow);
}
if (Convert.ToDateTime(drow["date"]) > Convert.ToDateTime(drow2["date"]))
{
duplicateList.Add(drow);
}
}
}
else
hTable.Add(drow[colName], string.Empty);
}
}
//Removing a list of duplicate items from datatable.
foreach (DataRow dRow in duplicateList)
dTable.Rows.Remove(dRow);
//Datatable which contains unique records will be return as output.
return dTable;
}
解决方案
所以你想根据 - 列删除重复项date
?您可以使用 LINQ:
List<DataRow> duplicateRows = dTable.AsEnumerable()
.GroupBy(r => r[colName])
.SelectMany(g => g
.Select(r => new
{
Row = r,
Date = DateTime.TryParse(r.Field<string>("date"), out DateTime date)
? date : new DateTime?()
})
.OrderByDescending(x => x.Date.HasValue)
.ThenByDescending(x => x.Date.GetValueOrDefault())
.Skip(1)) // only the first row of the group will be retained
.Select(x => x.Row)
.ToList();
duplicateRows.ForEach(dTable.Rows.Remove);
因此,首先包含日期值的所有行,该组按日期值本身降序排列,所以最新的在前,所有其他行都是重复的。
推荐阅读
- postgresql - Postgresql 传递多个范围并检查值是否在范围内
- react-native - 使用 RNCamera 将本机图像上传到服务器会导致网络错误
- swiftui - 自隐藏视图之间的智能分隔符
- python - 使用 amCharts 将 CSV 转换为 JSON 树结构(分层)?
- python-3.x - 读取由 nan 行拆分的数据帧,并在 Python 中将它们重塑为多个数据帧
- routes - SpringCloudGateway 背后的 SpringBootAdmin 配置
- numpy - Numpy.dot 挂起我的程序,我认为这是内存问题
- java - Ant 在构建期间不读取 IvySettings.xml 文件
- python - 如果条件在“if 表达式”中失败,python 可以跳过值而不是提供 None 或 False 吗?
- php - API 平台验证不会阻止自定义操作