使用 LINQ 检查数据表中条件上的重复行
本文关键字:条件 LINQ 检查 数据表 使用 | 更新日期: 2023-09-27 17:56:22
我有一个datatable
。 它有 5 列说(类型、A1、A2、B1、B2)如果类型为 A,我想确保没有 2 行在 A1 和 A2 列中具有相同的数据,并且对于类型 B,没有 2 行在 B1 和 B2 列中具有相同的数据例如
Type | A1 | A2 | B1 | B2 |
--------------------------
1 A | 123 | XY | | |
2 A | 123 | XY | | |
3 B | | | TT | LL |
4 A | 456 | YZ | | |
5 B | | | TT | LL |
6 A | 123 | YZ | | |
7 B | | | TT | LL |
8 A | 456 | YZ | | |
在这种情况下,我想标记第 1,2,4,8 行的错误以及第 3、5、7 行上的另一个错误。
第 6 行没问题。
首先,我已经完成了按键分组=类型为:
var groups = dt.AsEnumerable().GroupBy(r => r["Type"]).ToList();
我不确定我是否在每个组上进一步使用 for-,或者 linq 中有更好的方法。请指导。谢谢。
您可以对GroupBy
使用匿名类型:
var dupGroups = table.AsEnumerable()
.Select(r => new{
Row = r,
IsA = r.Field<string>("Type")=="A",
IsB = r.Field<string>("Type")=="B",
A1 = r.Field<string>("A1"),
A2 = r.Field<string>("A2"),
B1 = r.Field<string>("B1"),
B2 = r.Field<string>("B2"),
})
.GroupBy(x => x.IsA ? new { Val1 = x.A1, Val2 = x.A2 } : new { Val1 = x.B1, Val2 = x.B2 })
.Where(g => g.Count() > 1);
foreach (var dupGroup in dupGroups)
foreach (DataRow row in dupGroup.Select(x => x.Row))
row.RowError = "Duplicate detected";
结果:
DataTable errors = table.GetErrors().CopyToDataTable();
1 A 123 XY
2 A 123 XY
3 B TT LL
4 A 456 YZ
5 B TT LL
7 B TT LL
8 A 456 YZ
如您所见,第 6 行不是错误表的一部分,因为它不是重复项。