基于多列的数据表中删除重复行

Pra*_*eep 1 c# datatable dataview

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

Barcode Itemid PacktypeId

1      100      1

1      100      2

1      100      3

1      100      1

1      100      3
Run Code Online (Sandbox Code Playgroud)

仅需要包含 packtypeid 1,2,3 的行,应删除剩余的第 4 行和第 5 行

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

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

方法一:

 dt_Barcode = dt_Barcode.DefaultView.ToTable(true, "Barcode", "ItemID", "PackTypeID");
Run Code Online (Sandbox Code Playgroud)

上面的方法过滤了行,但它只返回列 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++;
                }
               }
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*eep 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(); 
Run Code Online (Sandbox Code Playgroud)