Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在datatable中查找并获取行索引 数据表。选择问题_Vb.net_Datatable - Fatal编程技术网

Vb.net 在datatable中查找并获取行索引 数据表。选择问题

Vb.net 在datatable中查找并获取行索引 数据表。选择问题,vb.net,datatable,Vb.net,Datatable,我有这样的简单数据表 | 1 | 2 | 3 | |------|------|------| | 1966 | 6544 | 1967 | | 9560 | 3339 | 4968 | | 0 | 9400 | 1765 | | 0 | 5479 | 6701 | 例如,我想检查列“1”中是否已经存在1966,如果存在,则获取行索引 我是这样写代码的 Dim search() As DataRow = table.Select(" '" & i

我有这样的简单数据表

|   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

您的查询当前试图以字符串形式查询数字字段,因此,如果您要查询的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

使用现有循环,只需在表中查找行:

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
将是一个数组,当不存在匹配项时将为空。

除非行索引包含在行本身的值中,否则您必须放弃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
代码如下:

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

IndexOf的使用很好。我仍然不能使用table。选择
Dim rows=table。选择(“1=1966”)
并使用类似这样的条件
“如果rows.Count>0,则
@PUROTIX您的代码对我的问题很好,但它是否比使用table.Select好?”@我猜这会比表快一点。选择方法。首先,它将在找到单个匹配项时停止(类似于.Any()vs.Count()>0),其次.IndexOf可能更昂贵。最好的确定方法是分析这两种方法。请遵循指南。你的回答漏掉了一些澄清。这对我很有效。正是我需要的,谢谢!我注意到,如果索引不存在,它会将索引返回为-1。所以你只需要做一个“If”语句,如果索引大于0,那么…你需要从那里得到什么。