在datatable中查找并​​获取行索引

时间:2016-09-30 13:54:51

标签: vb.net datatable

DataTable.Select问题

我有像这样的简单数据表

|   1  |  2   |   3  |
|------|------|------|
| 1966 | 6544 | 1967 | 
| 9560 | 3339 | 4968 | 
| 0    | 9400 | 1765 | 
| 0    | 5479 | 6701 | 

例如,我想检查列“1”中是否已存在1966,如果存在则获取行索引 我做这样的代码

Dim search() As DataRow = table.Select(" '" & i & "' = '" & value & "'   ")
  'where i is a integer from 1 to 3 and value is a biginteger
    If search.Count > 0 Then
        'get row index
    Else
        Console.WriteLine("not found")
    End If

4 个答案:

答案 0 :(得分:4)

使用现有循环,只需找到表格中的行:

Dim ndx As Int32
Dim rows = dtSample.Select("Id = 42")
If rows.Count > 0 Then
    ndx = dtSample.Rows.IndexOf(rows(0))
End If
Return ndx

使用扩展方法,您可以压缩它:

Dim ndx = dtSample.AsEnumerable().
                Where(Function(q) q.Field(Of Int32)("Id") = 42).
                Select(Function(z) dtSample.Rows.IndexOf(z)).
                ToArray()
在这种情况下,

ndx将是一个数组,并且在没有匹配时将为空。

答案 1 :(得分:2)

您的查询当前正在尝试将数字字段作为字符串进行查询,因此,如果您要查询的数据表列确实是整数,那么正确的语法将是:

Dim search() As DataRow = table.Select(i.ToString & " = " & value.ToString)

列名和数字周围没有单引号。然后,要获取索引,您需要在表中搜索返回的行的索引。 DataRowCollections有办法做到这一点,你只需要遍历查询的返回:

For Each dr As DataRow In table.Select(i.ToString & " = " & value.ToString)
    MsgBox(dr.Table.Rows.IndexOf(dr).ToString)
Next dr

答案 2 :(得分:0)

除非行索引包含在行本身的值中,否则您将不得不放弃Select方法并使用基于游标的方法。如果找到匹配项,此示例将停止循环:

Dim intTargetIndex As Integer = -1
Dim intCursor As Integer = 0

Do Until intCursor = table.Rows.Count OrElse intTargetIndex > -1

    If table.Rows(intCursor)(0).ToString() = value.ToString() Then

        intTargetIndex = intCursor

    End If

    intCursor += 1

Loop

答案 3 :(得分:0)

代码如下:

Dim rowIndex = dt.AsEnumerable().[Select](Function(r) r.Field(Of String)("Column_Name")).ToList().FindIndex(Function(col) col = "Find_Key")