【问题标题】:Get row index if some column value is equal to something如果某个列值等于某个值,则获取行索引
【发布时间】:2013-01-24 15:06:05
【问题描述】:

在这个数据表中没有重复项,我需要列 x 值等于 2 的行索引。我会这样做:

Dim rowIndex As Integer = 0
For i = 0 To mtable.Rows.Count - 1
            If mtable.Rows(i)("x") = 2 Then
                rowIndex = i
                Exit For
            End If
        Next

我将每秒多次调用此过程。在 .NET 中是否有更快的方法来执行此操作?

【问题讨论】:

  • 当然有不同的方法可以达到相同的结果。但这可能是最快的。某些索引可能会有所帮助,具体取决于您的数据集。
  • 我同意 Dan-o,您也可以将 If mtable.Rows(i)("x") = 2 Then 更改为 x 列的索引,例如:If mtable.Rows(i)(2) = 2 Then
  • 我会将 rowIndex 初始化为 -1,这样您就可以判断是否找不到该值。

标签: vb.net datatable


【解决方案1】:

DataTable 选择可以工作,我认为它应该比遍历行集合更快。

    var index = mtable.Rows.IndexOf(mtable.Select("x = 2").FirstOrDefault());

【讨论】:

    【解决方案2】:

    每秒多次有点含糊——几十还是几千?

    您可以创建一个哈希表,将“x”的值映射到行号:

    Dim nLookups = mtable.Rows.Count - 1
    Dim lookupHash As New Hashtable(nLookups)
    For i = 0 To nLookups
        lookupHash.Add(CInt(mtable.Rows(i)("x")), i)
    Next
    

    然后

    Dim rowSought As Integer = -1
    If lookupHash.ContainsKey(2) Then
        rowSought = lookupHash(2)
    End If
    

    或者如果“x”的可能值范围合适,您可以使用数组将值映射到行号。

    【讨论】:

    • 不超过 200 条记录,有问题的代码仍然可以,但是使用哈希表映射可以更快吗?
    • @user1570048 如果这就是您拥有的所有记录,那么如果速度是一个问题,那么可能值得考虑问题出在其他地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多