【问题标题】:Custom DataTable searches自定义数据表搜索
【发布时间】:2009-04-14 14:56:57
【问题描述】:

编辑:注意。我应该提到我对使用 .Select、DataRowView、RowFind 等不感兴趣。感谢您的这些建议,但我希望就目前的代码进行优化。

我编写了一个函数来在数据表中搜索数组中的术语。然后,我将数据表作为数据集返回,以便可以将其绑定到 DataGridView。有没有人有任何优化的想法?因为这是一个实时搜索(每个输入的词都会立即搜索),所以我想让这个功能尽可能快。速度实际上已经相当不错了,但我想我值得问问大家是否还有其他可以改变的地方。

  • VB.NET
  • .NET 2.0

公共函数 SearchEngine(ByVal terms() As String, ByRef residentTBL As DataTable) As DataSet 将 newdts 调暗为新数据集(“用户”) 暗淡 newtable, temptable As New DataTable Dim residentPassCeiling, tempPassCeiling, termsceiling As Integer residentPassCeiling = ResidentTBL.Rows.Count - 1 termsceiling = 条款.GetUpperBound(0) newtable = ResidentTBL.Clone

        For j = 0 To termsceiling

            If j < 1 Then
                '######################## BEGIN First Pass ########################################################################
                For i = 0 To residentPassCeiling

                    If ResidentTBL.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper = Terms(j).ToUpper Then
                        'we have an excact match on account skip further additions
                        newtable.Rows.Clear()
                        newtable.ImportRow(ResidentTBL.Rows(i))
                        newdts.Tables.Add(newtable)
                        Return newdts
                    Else
                        If _
                        ResidentTBL.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.displayName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.sn - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.givenName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.l - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.department - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.telephoneNumber - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.building - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Then
                            'then add to the row
                            newtable.ImportRow(ResidentTBL.Rows(i))
                        End If
                    End If

                Next i
                '######################## END First Pass ########################################################################
            Else
                '######################## BEGIN Second.. Pass(es) ########################################################################
                'Further searches we want to search the already filtered datatable from each term
                temptable = newtable.Clone
                temptable = newtable.Copy
                newtable.Clear()
                tempPassCeiling = temptable.Rows.Count - 1
                For i = 0 To tempPassCeiling

                    If temptable.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper = Terms(j).ToUpper Then
                        'we have an excact match on account skip further additions
                        newtable.Rows.Clear()
                        newtable.ImportRow(temptable.Rows(i))
                        newdts.Tables.Add(newtable)
                        Return newdts
                    Else
                        If _
                        temptable.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.sn - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.givenName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.l - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.department - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.telephoneNumber - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.building - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Then
                            'then add to the row
                            newtable.ImportRow(temptable.Rows(i))
                        End If
                    End If

                Next i

                temptable = Nothing
                '######################## END Second.. Pass(es) ########################################################################
            End If

        Next j
        newdts.Tables.Add(newtable)
        ResidentTBL = Nothing

        Return newdts
        newdts = Nothing

    End Function

【问题讨论】:

  • 如果您不想考虑更改它,您可能已经知道任何可用优化的答案。

标签: vb.net .net-2.0 datatable dataset


【解决方案1】:

您可能想研究使用 DataViews 过滤数据:

http://aspnet101.com/aspnet101/tutorials.aspx?id=31

【讨论】:

    【解决方案2】:

    您可以生成 DataTable 过滤字符串以从数据表中选择行。

    http://msdn.microsoft.com/en-us/library/system.data.datatable.select.aspx

    这里是关于过滤字符串的文档

    http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多