Skip to main content
 首页 » 编程设计

c#之基于多列的数据表去除重复行

2024年08月12日23qlqwjy

我有一个包含许多重复行的数据表,我需要根据多列从数据表中过滤这些行,以便在结果数据表中获得不同的行....

Barcode Itemid PacktypeId 
 
1      100      1 
 
1      100      2 
 
1      100      3 
 
1      100      1 
 
1      100      3 

只需要删除包含 packtypeid 1,2,3 的行,剩下的第 4 行和第 5 行

我尝试过使用两种方法,但都没有得到更好的结果

数据表包含超过 10 列,但唯一列是“Barcode”、“ItemID”、“PackTypeID”

方法一:

 dt_Barcode = dt_Barcode.DefaultView.ToTable(true, "Barcode", "ItemID", "PackTypeID"); 

上面的方法过滤了行,但它只返回列的 3 列值,我需要整个 10 列值。

Method-2: 
                   List<string> keyColumns = new List<string>(); 
                   keyColumns.Add("Barcode"); 
                   keyColumns.Add("ItemID"); 
                   keyColumns.Add("PackTypeID");    
           RemoveDuplicates(DataTable table, List<string> keyColumns) 
            { 
            var uniqueness = new HashSet<string>(); 
            StringBuilder sb = new StringBuilder(); 
            int rowIndex = 0; 
            DataRow row; 
            DataRowCollection rows = table.Rows;              
            int i = rows.Count; 
            while (rowIndex < i) 
            { 
                row = rows[rowIndex]; 
                sb.Length = 0; 
                foreach (string colname in keyColumns) 
                { 
                    sb.Append(row[colname]); 
                    sb.Append("|"); 
                } 
 
                if (uniqueness.Contains(sb.ToString())) 
                { 
                    rows.Remove(row); 
                } 
                else 
                { 
                    uniqueness.Add(sb.ToString()); 
                    rowIndex++; 
                } 
               } 

上述方法返回异常,如位置 5 处没有行

请您参考如下方法:

方法三:

我没有尝试以上 2 种方法,而是发现这个 Linq 方法非常有用

     dt_Barcode = dt_Barcode.AsEnumerable().GroupBy(r => new { ItemID = r.Field<Int64>("ItemID"), PacktypeId = r.Field<Int32>("PackTypeID") }).Select(g => g.First()).CopyToDataTable();