在DataTable中标记非唯一行

Phi*_*ohl 5 .net c# vb.net datatable performance

我有一个DataTable,我想检查三列中的值是否唯一.如果不是,则应使用值组合的第一个外观的行号填充最后一列.

例如,这个表:

ID    Name    LastName    Age    Flag
-------------------------------------
1     Bart    Simpson     10      -
2     Lisa    Simpson      8      -
3     Bart    Simpson     10      -
4     Ned     Flanders    40      -
5     Bart    Simpson     10      -
Run Code Online (Sandbox Code Playgroud)

应该导致这个结果:

Line  Name    LastName    Age    Flag
-------------------------------------
1     Bart    Simpson     10      -
2     Lisa    Simpson      8      -
3     Bart    Simpson     10      1
4     Ned     Flanders    40      -
5     Bart    Simpson     10      1
Run Code Online (Sandbox Code Playgroud)

我通过使用两个嵌套for循环迭代DataTable 并比较这些值来解决这个问题.虽然这适用于少量数据,但当DataTable包含大量行时,它会变得非常慢.

我的问题是:这个问题的最佳/最快解决方案是什么,关于数据量可以在100到20000行之间变化?
有没有办法用LINQ做到这一点?(我对它不太熟悉,但我想学习!)

Phi*_*ohl 0

好吧,我想我自己已经得到了答案。根据 James Wiseman 的回答中的建议,我尝试使用 LINQ 进行一些操作。

Dim myErrnrFnct = Function( current, first) If(first <> current, first, 0)
Dim myQuery = From row As DataRow In myDt.AsEnumerable _
                      Select New With { _
                        .LINE = row.Item("LINE"), _
                        .NAME = row.Item("NAME"), _
                        .LASTNAME = row.Item("LASTNAME"), _
                        .AGE = row.Item("AGE"), _
                        .FLAG = myErrnrFnct(row.Item("LINE"), myDt.AsEnumerable.First(Function(rowToCheck) _
                                                                                        rowToCheck.Item("NAME") = row.Item("NAME") AndAlso _
                                                                                        rowToCheck.Item("LASTNAME") = row.Item("LASTNAME") AndAlso _
                                                                                        rowToCheck.Item("AGE") = row.Item("AGE")).Item("LINE")) _
                      }
Run Code Online (Sandbox Code Playgroud)

通过这个查询,我得到了问题中描述的准确结果。该函数是必要的,因为如果没有其他行具有相同的值,myErrnrFnct我希望该列具有该值。Flag0

为了再次获得 DataTable myQuery,我必须添加此处描述的一些扩展:
如何:实现 CopyToDataTable,其中通用类型 T 不是 DataRow
然后,此行将执行以下操作:

Dim myNewDt As DataTable = myQuery.CopyToDataTable()
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好。有什么建议可以做得更好吗?