Buscar con BinarySearch o IndexOf

30/03/2005 - 17:47 por Jaimito | Informe spam
Hola compañeros...

Tengo un arreglo de una clase Libro, así:

' Esta es la clase Libro
Public Class Libro
Private _Id As Integer
Private _Nombre As String

Public Property Id() As Integer
'
' implementación
'
End Property

Public Property Nombre() As String
'
' implementación
'
End Property
End Class

' este es el arreglo
Dim _Libros() As Libro

Como se pueden dar cuenta la clase libro contiene dos propiedades: Id y
Nombre.

Ahora, existen dos métodos de la clase System.Array: BinarySearch, IndexOf;
que permiten buscar en un arreglo. El problema radica en que no sé cómo
buscar en el arreglo de Libros aquellos cuyo Nombre corresponda con cierta
cadena.

¿Es posible?

Gracias...

Preguntas similare

Leer las respuestas

#1 ajpb
30/03/2005 - 18:09 | Informe spam
Lee sobre Regular Expressions en .Net

System.Text.RegularExpressions

Ci vediamo

AJPB

"Jaimito" wrote:

Hola compañeros...

Tengo un arreglo de una clase Libro, así:

' Esta es la clase Libro
Public Class Libro
Private _Id As Integer
Private _Nombre As String

Public Property Id() As Integer
'
' implementación
'
End Property

Public Property Nombre() As String
'
' implementación
'
End Property
End Class

' este es el arreglo
Dim _Libros() As Libro

Como se pueden dar cuenta la clase libro contiene dos propiedades: Id y
Nombre.

Ahora, existen dos métodos de la clase System.Array: BinarySearch, IndexOf;
que permiten buscar en un arreglo. El problema radica en que no sé cómo
buscar en el arreglo de Libros aquellos cuyo Nombre corresponda con cierta
cadena.

¿Es posible?

Gracias...
Respuesta Responder a este mensaje
#2 Jaimito
30/03/2005 - 18:29 | Informe spam
Gracias AJPB, por tu respuesta, pero no quiero buscar parte de una cadena ni
algo por estilo, sino la cadena completa simplemente; como una simple
comparación "=" o "<>".

Entiendo lo de las expresiones regulares, pero no creo que sea lo que estoy
buscando, a menos que tu sepas una manera de utilizarlas para buscar
directamente sobre un arreglo, sin que exista la necesidad de iterrar sobre
cada elemento del arreglo para realizar la comparación.
Respuesta Responder a este mensaje
#3 Edgar Contreras
30/03/2005 - 19:56 | Informe spam
Que tal Jaimito...

Todo dependerá de lo que necesites lograr.

Por principio de cuentas, debes considerar que usar IndexOf puede llegar a
ser considerablemente más lento ya que esta realiza una búsqueda secuencial
a lo largo del arreglo hasta que encuentra el valor que estas buscando. El
método IndexOf te retornará un valor positivo que indica la posición en la
que se encontró la primer coincidencia dentro del arreglo y devolverá un
número igual al límite inferior menos 1 en caso de no encontrar
coincidencias. A que me refiero con esto último?... bien, si el arreglo está
basado en 0, si no encuentra el valor retornará -1 y si el arreglo está
basado en 1 te devolverá 0 en el mismo caso.

BinarySearch es, como su nombre lo indica, una búsqueda Binaria (podrías
compararla a la búsqueda en una estructura de datos de tipo Arbol). La pega
aquí es que el arreglo debe encontrarse ordenado para que resulte efectivo.
El valor que BinarySearch te retornará es el índice donde encontró la
coincidencia. De no haber tal, te retornará un valor negativo, el cual es el
complemento binario del índice del primer elemento que sea superior al valor
buscado, lo que significa que si niegas este valor obtendrás la posición en
donde insertar el dato.

Por ejemplo.

indice=Array.BinarySearch(strMatriz, "UNVALOR")
If indice>=0 Then
Console.WriteLine("Localizado en el indice (0)",indice)
Else
indice=not indice
Console.WriteLine("No encontrado. Insertar en el indice (0)",indice)
End If


Espero que con esto te des una idea de lo que puedes hacer.

Saludos,

Edgar Contreras


[Conectado desde Tijuana, B.C. México]

DISCLAIMER: La información es presentada como es, sin ninguna
responsabilidad, sin garantía alguna y no otorga
derecho alguno.



"Jaimito" wrote in message
news:
Hola compañeros...

Tengo un arreglo de una clase Libro, así:

' Esta es la clase Libro
Public Class Libro
Private _Id As Integer
Private _Nombre As String

Public Property Id() As Integer
'
' implementación
'
End Property

Public Property Nombre() As String
'
' implementación
'
End Property
End Class

' este es el arreglo
Dim _Libros() As Libro

Como se pueden dar cuenta la clase libro contiene dos propiedades: Id y
Nombre.

Ahora, existen dos métodos de la clase System.Array: BinarySearch,
IndexOf;
que permiten buscar en un arreglo. El problema radica en que no sé cómo
buscar en el arreglo de Libros aquellos cuyo Nombre corresponda con cierta
cadena.

¿Es posible?

Gracias...
Respuesta Responder a este mensaje
#4 Eduardo A. Morcillo [MS MVP VB]
30/03/2005 - 20:17 | Informe spam
Para IndexOf debes pasar el objeto exacto que quieres buscar. Para
BinarySearch, ademas de requerir que el arreglo este ordenado por el nombre
deberas implementar la interface IComparable para comparar los objetos por
el nombre.

Public Class Libro
Implements IComparable

' ...

Public Function CompareTo(ByVal obj As Object) As Integer _
Implements System.IComparable.CompareTo

If TypeOf obj Is String Then

Dim s As String = DirectCast(obj, String)

Return String.Compare(Nombre, s)

ElseIf TypeOf obj Is Libro Then

' Comparar el objeto entero

End If

Throw New ArgumentException

End Function

' Para ser totalmente correctos, se deberia tambien
' sobreescribir la funcion Equals para que devuelva
' un valor que corresponda con la comparacion de
' CompareTo.

End Class

Si las busquedas van a ser algo comun, te conviene usar un
NameValueCollection en lugar del array. NameValueCollection te permite
acceder a los elementos tanto por un indice (como el array) como por una
clave (en este caso, el nombre).

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida