【问题标题】:Distinct Rows From Vb.Net DataTable来自 Vb.Net 数据表的不同行
【发布时间】:2016-01-18 21:12:28
【问题描述】:

我有一个场景,我必须在 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

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

【问题讨论】:

    标签: vb.net datatable group-by


    【解决方案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
    

    【讨论】:

    • 它说Unable to cast object of type 'WhereSelectEnumerableIterator2[System.Data.DataRow,System.String]' 输入'System.String[]'。`
    • 我想在AnotherID 列的基础上保留所有不同的行
    • @DareDevil:那么您使用的是 .NET 3.5,因此是 Visual Studio 2008。您可以使用 r.SetField("City", String.Join(", ", cities.ToArray()))。我知道,但是如果根据AnotherID-column 有三个重复项,您想保留哪一行?我上面的方法用逗号连接所有城市。
    • 我可以这样使用Dim drows() As DataRow = dTable.Select("GROUP BY AnotherID Having COUNT(AnotherID) > 1 ")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2011-06-21
    • 2013-09-24
    相关资源
    最近更新 更多