使用 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 中有更好的方法。请指导。谢谢。

使用 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 行不是错误表的一部分,因为它不是重复项。