使用linq vb.net从datatable检索不同的值

使用linq vb.net从datatable检索不同的值,vb.net,linq,datatable,Vb.net,Linq,Datatable,我试图从datatable中的特定列检索所有不同的值。数据表中的列名为Count。我有2240行,计数列中有6个不同的值。问题是,当我执行以下代码时,它给出的是行数,而不是6个不同的值 Dim counts = (From row In loadedData Select row.Item("Count")).Distinct() For Each i In counts MsgBox(i) Next 我如何修改它来检索6个不同的值,而不是提供总行数?您只需选择列并使用Enumerab

我试图从datatable中的特定列检索所有不同的值。数据表中的列名为Count。我有2240行,计数列中有6个不同的值。问题是,当我执行以下代码时,它给出的是行数,而不是6个不同的值

Dim counts = (From row In loadedData
Select row.Item("Count")).Distinct()
For Each i In counts
    MsgBox(i)
Next

我如何修改它来检索6个不同的值,而不是提供总行数?

您只需选择列并使用Enumerable即可。不同:

在查询中,syntaxi不知道VB.NET直接支持Distinct:

distinctCounts = From row In loadedData
                 Select row.Field(Of Int32)("Count")
                 Distinct

您只需选择列并使用Enumerable即可。独特:

在查询中,syntaxi不知道VB.NET直接支持Distinct:

distinctCounts = From row In loadedData
                 Select row.Field(Of Int32)("Count")
                 Distinct

如果需要,也可以应用此逻辑, 首先通过columName对数据表进行排序, 然后应用这个逻辑

    dtRecords.DefaultView.Sort = "columnName"
    dtRecords = dtRecords.DefaultView.ToTable
    Dim totalRecords As Integer = 0
    Dim thNameStr As String = filter(dtRecords, "columnName", totalRecords )

Public Shared Function filter(ByVal dtRecords As DataTable, ByVal columnName As String, ByRef totalRecords As Integer) As String
            Dim FilterStr As String = ""
            Dim eachTotal As Integer = 0
            totalRecords = 0
            Dim lastName As String = ""
            For rCount = 0 To dtRecords.Rows.Count - 1
                If lastName <> "" And lastName <> dtRecords.Rows(rCount)("" & columnName) Then
                    FilterStr &= lastName & " - [" & eachTotal & "]"
                    eachTotal = 0
                    totalRecords += 1
                End If
                lastName = dtRecords.Rows(rCount)("" & columnName)
                eachTotal += 1
            Next
            FilterStr &= lastName & " - [" & eachTotal & "]"
            totalRecords += 1
            Return FilterStr 
        End Function

如果需要,也可以应用此逻辑, 首先通过columName对数据表进行排序, 然后应用这个逻辑

    dtRecords.DefaultView.Sort = "columnName"
    dtRecords = dtRecords.DefaultView.ToTable
    Dim totalRecords As Integer = 0
    Dim thNameStr As String = filter(dtRecords, "columnName", totalRecords )

Public Shared Function filter(ByVal dtRecords As DataTable, ByVal columnName As String, ByRef totalRecords As Integer) As String
            Dim FilterStr As String = ""
            Dim eachTotal As Integer = 0
            totalRecords = 0
            Dim lastName As String = ""
            For rCount = 0 To dtRecords.Rows.Count - 1
                If lastName <> "" And lastName <> dtRecords.Rows(rCount)("" & columnName) Then
                    FilterStr &= lastName & " - [" & eachTotal & "]"
                    eachTotal = 0
                    totalRecords += 1
                End If
                lastName = dtRecords.Rows(rCount)("" & columnName)
                eachTotal += 1
            Next
            FilterStr &= lastName & " - [" & eachTotal & "]"
            totalRecords += 1
            Return FilterStr 
        End Function

您可以使用ToTabledistinct作为布尔值,使用ParamArray columnNames作为字符串方法

loadedData.DefaultView.ToTable(True, "Count")
这将为您返回不同的用户。如果需要,可以添加多个列名

这是msdn文档。

您可以使用ToTabledistinct作为布尔值,使用ParamArray columnNames作为字符串方法

loadedData.DefaultView.ToTable(True, "Count")
这将为您返回不同的用户。如果需要,可以添加多个列名

这是msdn文档。

FYI-此数据表中的值都是唯一的。。。除了Count列之外。我相信这就是它返回2240行的原因,而不仅仅是6个唯一的计数值。仅供参考-此数据表中的值都是唯一的。。。除了Count列之外。我相信这就是它返回2240行的原因,而不仅仅是6个唯一的计数值。我试图使用您发布的代码,但我认为您没有阅读我的上一条评论。所有2240都是唯一的,但是我只是想得到唯一的count列。从datatable中选择distinct count-本质上是这样。@Johnjansen:这正是您发布的sql查询中的Linq到数据集的等价项。它只返回表中不同的计数。因此,如果表包含2240行,计数列包含6个不同的数字分布在所有行中,则查询只返回6个不同的数字。我试图使用您发布的代码,但我认为您没有阅读我的上一条注释。所有2240都是唯一的,但是我只是想得到唯一的count列。从datatable中选择distinct count-本质上是这样。@Johnjansen:这正是您发布的sql查询中的Linq到数据集的等价项。它只返回表中不同的计数。因此,如果表包含2240行,而Count列包含6个不同的数字分布在所有行上,那么查询只返回6个不同的数字。有点臃肿。这似乎需要很多代码来完成我可以用LINQ在3行代码中完成的事情。代码似乎一点也没有错,有点臃肿。这似乎需要很多代码来完成我可以用LINQ在3行代码中完成的事情。代码似乎一点也没有错。请编辑更多信息。仅编码并尝试此答案是,因为它们不包含可搜索的内容,并且不解释为什么有人应该尝试此选项。请使用更多信息进行编辑。仅编码并尝试此答案,因为它们不包含可搜索的内容,并且没有解释为什么有人应该尝试此答案。