【问题标题】:How can I search an array in VB.NET?如何在 VB.NET 中搜索数组?
【发布时间】:2009-03-30 13:44:21
【问题描述】:

我希望能够有效地在数组中搜索字符串的内容。
示例:

dim arr() as string={"ravi","Kumar","Ravi","Ramesh"}

我传递的值为“ra”,我希望它返回 2 和 3 的索引。

如何在 VB.NET 中做到这一点?

【问题讨论】:

  • 你不应该得到 0,2,3 吗?你显然在做一个不区分大小写的过滤器。
  • 传入“ra”会得到 0、2 和 3。
  • 让你的问题更清楚区分大小写还是什么??
  • VB.NET 的哪个版本?大多数答案似乎是 3.0+。
  • 他的意思是 .NET 版本的 3.0+。 :P

标签: vb.net arrays


【解决方案1】:

目前尚不清楚您要如何搜索数组。以下是一些替代方案:

查找包含确切字符串“Ra”的所有项目(返回项目 2 和 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.Contains("Ra"))

查找以确切字符串“Ra”开头的所有项目(返回项目 2 和 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.StartsWith("Ra"))

查找包含任何大小写版本“ra”的所有项目(返回项目 0、2 和 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.ToLower().Contains("ra"))

查找以任何大小写版本“ra”开头的所有项目(返回项目 0、2 和 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra"))

-

如果您没有使用 VB 9+,那么您就没有匿名函数,因此您必须创建一个命名函数。

例子:

Function ContainsRa(s As String) As Boolean
   Return s.Contains("Ra")
End Function

用法:

Dim result As String() = Array.FindAll(arr, ContainsRa)

拥有一个只能与特定字符串进行比较的函数并不总是很有用,因此要能够指定一个要与之比较的字符串,您必须将它放在一个类中以便在某个地方存储该字符串:

Public Class ArrayComparer

   Private _compareTo As String

   Public Sub New(compareTo As String)
      _compareTo = compareTo
   End Sub

   Function Contains(s As String) As Boolean
      Return s.Contains(_compareTo)
   End Function

   Function StartsWith(s As String) As Boolean
      Return s.StartsWith(_compareTo)
   End Function

End Class

用法:

Dim result As String() = Array.FindAll(arr, New ArrayComparer("Ra").Contains)

【讨论】:

  • 我认为他在寻找索引
【解决方案2】:
Dim inputString As String = "ra"
Enumerable.Range(0, arr.Length).Where(Function(x) arr(x).ToLower().Contains(inputString.ToLower()))

【讨论】:

  • 已更正。我将参数xinputString 混淆了
【解决方案3】:

如果您想要一个经常重复的高效搜索,请先对数组进行排序 (Array.Sort),然后使用 Array.BinarySearch

【讨论】:

    【解决方案4】:

    如果您正在寻找旧版本的 .NET,请使用:

    Module Module1
    
        Sub Main()
            Dim arr() As String = {"ravi", "Kumar", "Ravi", "Ramesh"}
            Dim result As New List(Of Integer)
            For i As Integer = 0 To arr.Length
                If arr(i).Contains("ra") Then result.Add(i)
            Next
        End Sub
    
    End Module
    

    【讨论】:

    • 别忘了 ToLower... 所写的算法不会返回 2 和 3,只有 0。
    • 这是他的选择,以及 Contains 或 ForEach;他并没有真正说他是否希望他的检查忽略大小写,或者他是否希望他的查询是“StartsWith”或“Contains”函数,这是他的选择。看以前的帖子。
    【解决方案5】:

    检查一下..

            string[] strArray = { "ABC", "BCD", "CDE", "DEF", "EFG", "FGH", "GHI" };
            Array.IndexOf(strArray, "C"); // not found, returns -1
            Array.IndexOf(strArray, "CDE"); // found, returns index
    

    【讨论】:

      【解决方案6】:

      如果与输入匹配,则比较数组中的属性,然后将某些内容设置为循环当前位置的值,这也是当前查找项的索引。

      简单的例子。

      dim x,y,z as integer
      dim aNames, aIndexes as array
      dim sFind as string
      for x = 1 to length(aNames)
      
          if aNames(x) = sFind then y = x
      

      y 然后是数组中项目的索引,然后循环也可以用于将这些存储在数组中,因此您将拥有:

      z = 1
      for x = 1 to length(aNames)
          if aNames(x) = sFind then 
              aIndexes(z) = x 
              z = z + 1
          endif
      

      【讨论】:

        【解决方案7】:

        VB

        Dim arr() As String = {"ravi", "Kumar", "Ravi", "Ramesh"}
        Dim result = arr.Where(Function(a) a.Contains("ra")).Select(Function(s) Array.IndexOf(arr, s)).ToArray()
        

        C#

        string[] arr = { "ravi", "Kumar", "Ravi", "Ramesh" };
        var result = arr.Where(a => a.Contains("Ra")).Select(a => Array.IndexOf(arr, a)).ToArray();
        

        -----详细-----

        Module Module1
        
            Sub Main()
                Dim arr() As String = {"ravi", "Kumar", "Ravi", "Ramesh"}
                Dim searchStr = "ra"
                'Not case sensitive - checks if item starts with searchStr
                Dim result1 = arr.Where(Function(a) a.ToLower.StartsWith(searchStr)).Select(Function(s) Array.IndexOf(arr, s)).ToArray
                'Case sensitive - checks if item starts with searchStr
                Dim result2 = arr.Where(Function(a) a.StartsWith(searchStr)).Select(Function(s) Array.IndexOf(arr, s)).ToArray
                'Not case sensitive - checks if item contains searchStr
                Dim result3 = arr.Where(Function(a) a.ToLower.Contains(searchStr)).Select(Function(s) Array.IndexOf(arr, s)).ToArray
                Stop
            End Sub
        
        End Module
        

        【讨论】:

        • 这种扩展性很差,因为它会为找到的每个匹配项在数组中循环一次。
        • 问题是他想要索引,而不想要值。
        • 子数组中没有属性索引。这实际上是一个好主意,数组中的所有项都应该有一个属性 Array 来访问数组和 Index 来获得该项在数组中的索引...
        • Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra")) 我在 VB.NET 2005 中使用过您的代码,但在 Function 关键字中出现错误。不接受,请帮忙
        • 我发布了另一个适用于 .NET 2.0 的代码,之前的代码适用于 3.0+(可能只有 3.5 donno,但不适用于 3.0)。
        【解决方案8】:

        切勿使用 .ToLower 和 .ToUpper。

        我刚刚在土耳其遇到了问题,那里有 4 个“i”字母。使用 ToUpper 时,我得到了错误的“Ì”,但它失败了。

        使用不变的字符串比较: 常量 LNK as String = "LINK" Dim myString = "链接"

        不好: 如果 myString.ToUpper = LNK 那么...

        好,适用于整个世界: If String.Equals(myString, LNK , StringComparison.InvariantCultureIgnoreCase) 则...

        【讨论】:

          【解决方案9】:

          这样就可以解决问题,返回索引为 0、2 和 3 的值。

          Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra"))
          

          【讨论】:

          • 这不会返回索引而是返回实际元素,这不是 OP 指定的。
          • Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra")) 我在 VB.NET 2005 中使用过您的代码,但在 Function 关键字中出现错误。不接受,请帮忙
          • Dim result2 = arr.Where(Function(a) a.StartsWith(searchStr)).Select(Function(s) Array.IndexOf(arr, s)).ToArray
          • 此代码仅适用于 VB 9.0+(即 Visual Studio 2008)。您应该始终指定您在问题中使用的版本。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-09
          相关资源
          最近更新 更多