我有datatable
。它有5列说(Type,A1,A2,B1,B2)
如果Type为A,我想确保在A1和A2列中没有2行具有相同的数据
对于类型B,在B1和B2列中没有2行具有相同的数据
e.g。
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行没问题。
首先,我在Key = Type上完成了Group by:
var groups = dt.AsEnumerable().GroupBy(r => r["Type"]).ToList();
我不确定我是否在每个组中进一步使用for-each或者在linq中有更好的方法。 请指导。 感谢。
答案 0 :(得分:0)
您可以对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行不是错误表的一部分,因为它不是重复的。