我正在尝试获取列的重复值,以便在datatable
的{{1}}的另一列中显示错误消息Duplicate Values Not Allowed
为此,我正在对datatable
列进行分组,并检查重复项是否存在,如下所示
DataTable dt = new DataTable();
dt.Rows.Cast<DataRow>().ToList().ForEach(r => checkValidation(r, i++));
private void checkValidation(DataRow Row, int RowId)
{
if ((dt.Rows.Cast<DataRow>().ToList().GroupBy(r => r[colName]).SelectMany(dup => dup.Skip(1))).Count() > 0)
{
Row["Error List"] += "Duplicate Values Not Allowed";
}
}
这里的问题是它会为所有具有重复值的行提供错误消息,如下所示
Name Error List
---------- ----------
Test Upload Duplicate Values Not Allowed
Test Upload Duplicate Values Not Allowed
但我想要的是
Name Error List
---------- ----------
Test Upload
Test Upload Duplicate Values Not Allowed
为了得到它,我们只能比较当前索引的索引较少的行。但是如何使用lambda表达式来做同样的事情。
答案 0 :(得分:0)
您的代码正在检查任何重复项,然后将当前行标记为重复。除了分配错误之外,行Row
不会在验证检查中的任何位置使用。
如果这样做,您将进行相同的验证 n 次,其中 n 是行数。为什么不采用不同的方法并一次性进行验证呢?
您可以获得所有重复的组:
var duplicateGroups = dt.Rows
.Cast<DataRow>()
.GroupBy(r => r["Name"])
.Where(g => g.Count() > 1);
然后为除第一个之外的所有重复项设置错误:
foreach (var row in duplicateGroups.SelectMany(g => g.Skip(1)))
{
row["Error List"] += "Duplicate Values Not Allowed";
}
使用我的测试数据,我得到了这个输出:
Name Error List
--------------------------------------------
Test Upload
Test Upload Duplicate Values Not Allowed
Test Upload Duplicate Values Not Allowed
Test Upload 2
Test Upload 2 Duplicate Values Not Allowed
Test Upload 3