比较Lambda表达式中当前索引的索引记录少

时间:2015-05-07 11:07:19

标签: c# asp.net-mvc lambda

我正在尝试获取列的重复值,以便在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表达式来做同样的事情。

1 个答案:

答案 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