我有一个包含许多重复行的数据表,我需要根据多列从数据表中过滤这些行,以便在结果数据表中获得不同的行....
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();