在数据表中查找并获取行索引

3

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
5个回答

7

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

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()
< p > ndx 在这种情况下将是一个数组,如果没有匹配,则为空。


在这种情况下, ndx 将是一个数组,如果没有匹配,则为空。

1
很好地使用了IndexOf函数。 - NoAlias
我仍然无法使用 table.Select
Dim rows = table.Select("1 = 1966") 并使用以下条件 'If rows.Count > 0 Then @Plutonix
- hagant

3

您的查询当前尝试将数字字段作为字符串进行查询,因此如果您查询的Datatable列确实是整数,则正确的语法应该是:

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

1

这里是代码:

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

2
请遵循如何回答指南。您的回答缺少一些澄清。 - Anna
这对我非常有效。正是我所需要的,谢谢!我注意到如果索引不存在,它将返回索引为-1。因此,您只需编写一个“if”语句,如果索引大于0,则...从那里获取您需要的任何内容。 - Mark

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

你的代码对我的问题起作用了,但是它是否比使用 table.Select 更好呢? @NoAlias - hagant
我猜这种方法比使用table.Select()会更快一些。首先,它找到第一个匹配项就会停止(类似于.Any() vs .Count() > 0),其次.IndexOf可能更昂贵。要确保哪种方法更好,最好的方法是对两种方法进行分析。 - NoAlias

0

首先,对您的数据表进行选择,然后使用For Each获取行索引。

Dim result() As DataRow = tblchk.Select("Device_No ='" & TxtBarcode.Text & "'")
For Each row As DataRow In result
    MsgBox(row.Table.Rows.IndexOf(row)) ''this is for row index value
Next

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接