2009-03-30 66 views
6

Quiero ser capaz de buscar eficazmente una matriz para el contenido de una cadena.
Ejemplo:¿Cómo puedo buscar una matriz en VB.NET?

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

paso el valor es "ra" y quiero que vuelva el índice de 2 y 3.

¿Cómo se puede hacer esto en VB.NET I?

+1

¿No debería obtener 0,2,3? Claramente estás haciendo un filtro que no distingue entre mayúsculas y minúsculas. – belgariontheking

+0

Al pasar en "ra" obtendrá 0, 2 y 3. –

+0

Haga su pregunta más clara sensible a mayúsculas o qué? – Shimmy

Respuesta

3
Dim inputString As String = "ra" 
Enumerable.Range(0, arr.Length).Where(Function(x) arr(x).ToLower().Contains(inputString.ToLower())) 
+0

Agregó que en la publicación –

+0

Corregido. Confundí el parámetro 'x' con' inputString' –

-1

Esto haría el truco, la devolución de los valores a los Indices de 0, 2 y 3.

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

Esto no devolverá los índices sino los elementos reales, que no es el OP especificado. –

+0

cierto, cierto. Ah bien ... –

+0

Array.FindAll (arr, Función (es) s.ToLower(). StartsWith ("ra")) He usado tu código en VB.NET 2005 pero obtengo un error en la palabra clave Function. No acepta, por favor ayuda – somu

2

Si desea una búsqueda eficiente que a menudo se repite, primero ordenar el array (Array.Sort) y luego use Array.BinarySearch.

14

No está exactamente claro cómo desea buscar la matriz. Estas son algunas alternativas:

buscar todos los elementos que contienen la cadena exacta "Ra" (devuelve los elementos 2 y 3):

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

buscar todos los elementos que comienzan con la cadena exacta "Ra" (devuelve los elementos 2 y 3):

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

buscar todos los elementos que contengan cualquier versión caso de "ra" (devuelve los elementos 0, 2 y 3):

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

Buscar todos los elementos que empiecen con cualquier versión caso de "ra" (Retuns artículos 0, 2 y 3):

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

-

Si no está utilizando VB 9+ entonces usted no tiene anónima funciones, por lo que debe crear una función nombrada.

Ejemplo:

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

Uso:

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

tiene una función que sólo se puede comparar con una cadena específica no siempre es muy útil, por lo que es capaz de especificar una cadena para comparar para usted tendría que ponerlo en una clase para tener un lugar para almacenar la cadena:

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 

Uso:

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

Creo que estaba buscando el índice – Shimmy

+0

Sí, quizás ... Eso tampoco está muy claro. – Guffa

0

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(); 

----- Detallada ------

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 
+0

Eso se escala mal, ya que recorrerá la matriz un tiempo extra por cada coincidencia encontrada. – Guffa

+0

El problema es que él quiere el índice, no quiere los valores. – Shimmy

+0

No hay índice de propiedad en una matriz secundaria. En realidad es una buena idea, todos los elementos de una matriz deben tener una propiedad Array para acceder a la matriz e Index para tener el índice de este elemento en la matriz ... – Shimmy

2

En caso de que se busca una versión anterior de .NET a continuación, utilizar:

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 
+0

No olvide ToLower ... el algoritmo como está escrito no devolvería 2 y 3, solo 0. – cdmckay

+0

Esa es su elección, así como Contiene o ForEach; No dijo realmente si él quiere que su cheque ignore el caso, o si quiere que su consulta sea función "StartsWith" o "Contains", esa es su elección. Mira en la publicación anterior. – Shimmy

1

comparar las propiedades de la matriz si uno coincide con la entrada a continuación, establecer algo que el valor de los lazos de posición actual, que es también el índice del elemento buscado actual.

simple ej.

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 es entonces el índice del elemento de la matriz, entonces bucle se podría utilizar para almacenar estos en una matriz también lo que en lugar de lo anterior se tendría:

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

cheque esto.

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