来自Vb.Net DataTable的不同行

时间:2016-01-18 12:39:14

标签: vb.net datatable group-by

我有一个场景,我必须在DataTable上应用不同的过滤器,并找到只有不同的行, 我正在使用dt.DefaultView.ToTable(True, Columns)此声明,但没有效果。

这是我的一大堆代码..

Try
        Dim dTable As New DataTable()
        dTable.Columns.Add("AutoID")
        dTable.Columns.Add("AnotherID")
        dTable.Columns.Add("CitY")
        Dim row As DataRow = Nothing
        For i As Integer = 0 To 4
            row = dTable.NewRow()
            row("AutoID") = i + 1
            row("AnotherID") = i + 10
            row("City") = "Vetican"
            dTable.Rows.Add(row)
        Next
        dTable.Rows.Add(6, "11", "Oslo")
        dTable.Rows.Add(7, "12", "Toronto")

        Dim TobeDistinct As String() = {"AnotherID"}
        Dim dtDistinct As DataTable = GetDistinctRecords(dTable, TobeDistinct)

    Catch ex As Exception

    End Try

和方法..

Public Shared Function GetDistinctRecords(ByVal dt As DataTable, ByVal Columns As String()) As DataTable
    Dim dtURecords As New DataTable()
    dtURecords = dt.DefaultView.ToTable(True, Columns)
    Return dtURecords
End Function

这是屏幕截图,我想要..

1 个答案:

答案 0 :(得分:1)

您要保留哪些行以及应删除哪些行?如果您只是希望每AnotherID行保留一行,那么保持Vetican而不是Oslo似乎是任意的。也许你想要像Vetican, Oslo中那样连贯。

我会改用Linq

Dim resultTable = dTable.Clone() ' empty table same columns
Dim idGroups = dTable.AsEnumerable().GroupBy(Function(r) r.Field(Of String)("AnotherID"))
For Each grp In idGroups
    Dim r As DataRow = resultTable.Rows.Add()
    r.SetField("AutoID", grp.First().Field(Of String)("AutoID"))
    r.SetField("AnotherID", grp.Key)
    Dim cities = From row In grp Select row.Field(Of String)("City")
    r.SetField("City", String.Join(", ", cities))
Next