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,则删除具有空值的行,并仅显示具有空值的学生id
  • 如果该学生的两个标记均为空,则仅显示一行
  • 结果数据表应为

    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();