使用linq检查数据表中条件的重复行

时间:2014-04-02 10:17:27

标签: c# linq foreach datatable

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

1 个答案:

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