【问题标题】:How do I make a search insensitive in VB.NET?如何在 VB.NET 中使搜索不敏感?
【发布时间】:2024-01-12 08:58:01
【问题描述】:

这是我的第一篇文章,请告诉我如何改进。

我的问题分为两部分。首先,我正在创建一个搜索功能,该功能在文本框中获取文本,在数据库中引用它并将结果添加到数据网格视图中。它有效,但它区分大小写且冗长。我已经设法解决了敏感性问题,但并非没有添加大量线条。此外,我的方法是在数据网格视图中产生多个相同的结果。

我的问题是:有没有更简单的方法来编码这个搜索,我怎样才能让它不敏感?

 dgvFileInfo.Rows.Clear()

    If searchBox.Text = "" Then 

    ElseIf srchCrit = "ProjectNumber" Then
        Dim srchDesc As String = ""
        Dim rtrnDesc As String = ""
        Dim j As Integer = 0

        For Each row As DataRow In TblFiles.Rows
            rtrnDesc = row.Item(srchCrit).ToString
            srchDesc = searchBox.Text
            If rtrnDesc.Contains(srchDesc) Then
                dgvFileInfo.Rows.Add()
                dgvFileInfo.Item(0, j).Value = row.Item("ProjectNumber").ToString
                dgvFileInfo.Item(1, j).Value = row.Item("ProjectName").ToString
                dgvFileInfo.Item(2, j).Value = row.Item("Client").ToString
                dgvFileInfo.Item(3, j).Value = row.Item("City").ToString & ", " & row.Item("State").ToString
                j += 1
            End If
        Next
    Else
        Dim srchDesc As String = ""
        Dim rtrnDesc As String = ""
        Dim j As Integer = 0

        Dim letter As Char = searchBox.Text.Substring(0, 1)
        Dim line As String = searchBox.Text.Substring(1, searchBox.Text.Length - 1)

        For Each row As DataRow In TblFiles.Rows '***Here's my sensitivity issue**
            rtrnDesc = row.Item(srchCrit).ToString
            srchDesc = UCase(letter) & line
            If rtrnDesc.Contains(srchDesc) Then
                dgvFileInfo.Rows.Add()
                dgvFileInfo.Item(0, j).Value = row.Item("ProjectNumber").ToString
                dgvFileInfo.Item(1, j).Value = row.Item("ProjectName").ToString
                dgvFileInfo.Item(2, j).Value = row.Item("Client").ToString
                dgvFileInfo.Item(3, j).Value = row.Item("City").ToString & ", " & row.Item("State").ToString
                j += 1
            End If

            srchDesc = LCase(letter) & line
            If rtrnDesc.Contains(srchDesc) Then
                dgvFileInfo.Rows.Add()
                dgvFileInfo.Item(0, j).Value = row.Item("ProjectNumber").ToString
                dgvFileInfo.Item(1, j).Value = row.Item("ProjectName").ToString
                dgvFileInfo.Item(2, j).Value = row.Item("Client").ToString
                dgvFileInfo.Item(3, j).Value = row.Item("City").ToString & ", " & row.Item("State").ToString
                j += 1
            End If

            srchDesc = LCase(letter) & LCase(line)
            If rtrnDesc.Contains(srchDesc) Then
                dgvFileInfo.Rows.Add()
                dgvFileInfo.Item(0, j).Value = row.Item("ProjectNumber").ToString
                dgvFileInfo.Item(1, j).Value = row.Item("ProjectName").ToString
                dgvFileInfo.Item(2, j).Value = row.Item("Client").ToString
                dgvFileInfo.Item(3, j).Value = row.Item("City").ToString & ", " & row.Item("State").ToString
                j += 1
            End If

            srchDesc = UCase(letter) & UCase(line)
            If rtrnDesc.Contains(srchDesc) Then
                dgvFileInfo.Rows.Add()
                dgvFileInfo.Item(0, j).Value = row.Item("ProjectNumber").ToString
                dgvFileInfo.Item(1, j).Value = row.Item("ProjectName").ToString
                dgvFileInfo.Item(2, j).Value = row.Item("Client").ToString
                dgvFileInfo.Item(3, j).Value = row.Item("City").ToString & ", " & row.Item("State").ToString
                j += 1
            End If

        Next

    End If

【问题讨论】:

  • 一种改进方法——不要发布太多不相关的代码。另一种方法是在发布 VB.NET 问题时始终包含 vb.net 标记。这样,VB.NET 专家就会看到您的问题。

标签: vb.net search case-insensitive


【解决方案1】:

1) 您在应用程序端进行比较,这意味着它发生在 VB 代码中。要进行不区分大小写的搜索,您可以执行 .ToUpper().ToLower() 并以这种方式进行比较。或者,您可以使用String.Compare

' using ToUpper (ToLower would be the same)
Dim isFound as Boolean = ("My string".ToUpper() = row("myField").ToString().ToUpper())

' using String.Compare
Dim isFound as Boolean = (String.Compare("My String", row("myField"), True) = 0)

2) 最简单的方法是在数据库中进行搜索。如果您可以做到这一点并且您的数据库不区分大小写(SQL Server 实例默认不区分大小写),您现在可以使用 LINQ 和/或像 NHibernate 这样的 ORM 在数据库中构建和执行 sql。这将是一连串的问题,已经在 SO 和网络上多次回答。

【讨论】:

  • 谢谢!我会试试这些建议。
【解决方案2】:

我通过其他一些帖子找到了一种不区分大小写搜索的好方法。

If myString.IndexOf(myVar, 0, StringComparison.CurrentCultureIgnoreCase) > -1 Then
       'your code here
End If

这对我来说效果很好,我希望你觉得它有用。

【讨论】: