我有像这样的简单数据表
| 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
答案 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")