c# - 使用条件从 DataTable 中删除重复行 - C#
问题描述
我有一个如下的数据表
StudentID Marks
AAA NULL
AAA 100
BBB 200
我必须通过在以下条件下检查 studentID 从数据表中删除该行
- 如果有相同的学生 ID,则删除具有 NULL 值的行并仅显示具有值的学生 ID。
- 如果该学生的两个标记均为 NULL,则仅显示一行。
结果数据表应该是
StudentID Marks
AAA 100
BBB 200
我试图使用下面的函数从上表中删除重复的行
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)
{
if (hTable.Contains(drow[colName])&& drow["Marks"]==null)
{
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;
}
解决方案
DataTable datatabble = new DataTable();
datatabble.Columns.Add("studentid", typeof(string));
datatabble.Columns.Add("marks", typeof(int));
datatabble.Rows.Add("AAA");
datatabble.Rows.Add("AAA",100);
datatabble.Rows.Add("BBB",200);
var duplicates = datatabble.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1)
.Select(dupl => dupl.Key).ToList();
var result = datatabble.AsEnumerable().Where(x =>
(
(duplicates.Contains(x[0]) && !string.IsNullOrEmpty(x[1].ToString()))
|| !duplicates.Contains(x[0])
)
).ToList();
输出:您可以看到带有过滤空值的 2 行计数的输出。
推荐阅读
- amazon-web-services - docker-machine 和 kubernetes
- python - 如何在获取结果之前获取与 sqlalchemy 结果代理对象关联的结果数量?
- node.js - /bin/sh: 1: node_modules/.bin/nodemon: 未找到
- javascript - 未找到模块:无法解析 'F:\CFC\aaa\src\components\Login' 中的 'react-bootstrap/Panel'
- powershell - 从脚本运行时格式意外更改
- django - 如何在 django 的表单操作中发送选定的选项值
- jenkins - Run Jenkinsfile with hardcoded parameters
- android - 删除短信和阅读通话记录权限后,我仍然收到 Google 警告
- angular - How to unit test 'navigate' with Query Params in Angular?
- rx-java2 - Flowable.merge() 的并发保证是什么