C# 使用条件-C从DataTable中删除重复行#
我有一个数据表如下C# 使用条件-C从DataTable中删除重复行#,c#,asp.net,datatable,C#,Asp.net,Datatable,我有一个数据表如下 StudentID Marks AAA NULL AAA 100 BBB 200 我必须通过检查studentID从datatable中删除该行,条件是 若有相同的studentID,则删除具有空值的行,并仅显示具有空值的学生id 如果该学生的两个标记均为空,则仅显示一行 结果数据表应为 StudentID Marks AAA 100 BBB 200 我尝试使用下面的函数从上面的表中删
StudentID Marks
AAA NULL
AAA 100
BBB 200
我必须通过检查studentID从datatable中删除该行,条件是
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;
}
输出:您可以看到带有过滤空值的2行计数的输出
还要注意datatable和datatables标记之间的区别。第二个问题在这个问题上没有立足之地。第三点毫无意义。这纯粹是任意的吗?与其使用foreach循环,为什么不创建一个对象列表并使用linq匹配您的条件,然后用它创建一个数据表呢?您的代码不会根据您的条件尝试删除。它删除第二个和后续条目,保留第一个条目,不管应该保留哪一个。@JonathanWillcock Point 2作为我的代码工作。
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();