【问题标题】:Retrieve distinct values from datatable using linq vb.net使用 linq vb.net 从数据表中检索不同的值
【发布时间】:2013-10-08 12:18:51
【问题描述】:

我正在尝试从数据表中的特定列中检索所有不同的值。数据表中的列名是“Count”。我有 2240 行,并且在“计数”列中有 6 个不同的值。问题是,当我执行以下代码时,它给了我行数而不是 6 个不同的值。

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

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

【问题讨论】:

  • 仅供参考 - 此数据表中的值都是唯一的......除了“计数”列的值。我相信这就是为什么它返回 2240 行,而不仅仅是 6 个唯一计数值。

标签: vb.net linq datatable


【解决方案1】:

您只需选择列并使用Enumerable.Distinct

Dim distinctCounts As IEnumerable(Of Int32) = loadedData.AsEnumerable().
    Select(Function(row) row.Field(Of Int32)("Count")).
    Distinct()

在查询语法中(我不知道VB.NET中甚至直接支持Distinct):

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

【讨论】:

  • 我尝试使用您发布的代码,但我认为您没有阅读我的最后评论。所有 2240 都是唯一的,但我只是想获得唯一计数列。 “从数据表中选择不同的计数” - 本质上。
  • @JohnJanssen:这正是您发布的 sql 查询中的 Linq-To-DataSet 等价物。它只返回表中的不同计数。因此,如果表包含 2240 行且Count 列包含 6 个不同的数字(分布在所有行中),则查询仅返回 6 个不同的数字。
【解决方案2】:

您可以为此使用 ToTable(distinct As Boolean, ParamArray columnNames As String()) 方法。

loadedData.DefaultView.ToTable(True, "Count")

这将为您返回不同的用户。您可以根据需要添加多个列名。

这里是 msdn 文档。 https://msdn.microsoft.com/en-us/library/wec2b2e6(v=vs.110).aspx

【讨论】:

  • 请编辑更多信息。仅代码和“试试这个”的答案是 discouraged,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。
【解决方案3】:

如果你愿意,你也可以应用这个逻辑, 首先通过 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

【讨论】:

  • 有点臃肿。这似乎有很多代码可以做与我可以在 3 行代码中使用 LINQ 做的事情相同的事情。不过,代码似乎并没有错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多