none
Cómo puedo hacer una función de búsqueda en una lista cuyos elementos son de la siguiente clase... RRS feed

  • Pregunta

  • Si tengo una clase como esta:

    Public Class ClaseObjeto
    
      Public Sub New(Id As Integer, Material As String, Marca As String)
        _Id = Id
        _Material = Material
        _Marca = Marca
      End Sub
    
      Public Property Id As Integer
      Public Property Material As String
      Public Property Marca As String
    End Class

    Y declaro una lista cuyos elementos son de la clase anterior:

    Dim ListaObjetos As List(Of ClaseObjeto)

    Deseo buscar un objeto por Marca (suponiendo que las marcas no se repiten) y que me devuelva el Id.

    Por ejemplo, si la lista tiene los siguientes datos:

    1...Vidrio.......MarcaA

    2...Madera.....MarcaB

    3...Fierro.......MarcaC

    E ingreso MarcaB, que me retorne 2, correspondiente a su Id.

    Entiendo que la búsqueda sería más o menos así:

    Dim IdEncontrado As Integer = list.Find(Function(ALGO) Return ( )

    End Function)


    Si se pudiera que la función de búsqueda esté en la misma línea de list.Find


    • Editado James2016-2 martes, 3 de diciembre de 2019 4:24
    martes, 3 de diciembre de 2019 4:23

Respuestas

  • hay varias formas de lograrlo una de ellas es atraves de  una consulta usando linq si no estoy mal seria mas o menos a si

    Module Module1

        Sub Main()
            Dim lista As New List(Of ClaseObjecto)

            lista.Add(New ClaseObjecto With {.Id = 1, .Material = "Vidrio", .Marca = "MarcaA"})
            lista.Add(New ClaseObjecto With {.Id = 2, .Material = "Madera", .Marca = "MarcaB"})
            lista.Add(New ClaseObjecto With {.Id = 3, .Material = "Fierro", .Marca = "MarcaC"})


            Dim query = From datos In lista Select datos.Id, datos.Material, datos.Marca Where Marca = "MarcaB"
        

            For Each result In query
                Console.WriteLine("Id = " & result.Id)
            Next


            Console.ReadLine()
        End Sub

    End Module

    Public Class ClaseObjecto

        Public Property Marca As String
        Public Property Id As Integer
        Public Property Material As String

    End Class






    • Editado DANTE-3D martes, 3 de diciembre de 2019 11:07
    • Propuesto como respuesta Diana AcuñaModerator martes, 3 de diciembre de 2019 15:56
    • Marcado como respuesta James2016-2 martes, 3 de diciembre de 2019 16:43
    martes, 3 de diciembre de 2019 11:02
  • Hola:
    En un Form como el de la imagen


    Copia y pega el siguiente codigo

    Option Strict On
    Option Explicit On

    Public Class Form3
        Private mLista As New List(Of Inmueble)
        Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
            txtId.ReadOnly = True
            txtPrecio.ReadOnly = True
            mLista.Add(New Inmueble(1, "Calle 1", 29920.23D))
            mLista.Add(New Inmueble(2, "Calle 2", 199923.33D))
            mLista.Add(New Inmueble(3, "Calle 3", 288888D))
            mLista.Add(New Inmueble(4, "Calle 4", 282345D))
            mLista.Add(New Inmueble(5, "Calle 5", 54321D))
        End Sub
        Private Sub btnBuscar_Click(sender As Object, e As EventArgs) Handles btnBuscar.Click
            Dim index As Integer = mLista.FindIndex(AddressOf EncontrarInmuebleByCalle)
            If (index = -1) Then
                MessageBox.Show("No existe en la lista el inmueble indicado.")
            Else
                txtId.Text = Convert.ToString(mLista.Item(index).Id)
                txtPrecio.Text = Convert.ToString(mLista.Item(index).Precio)
            End If
        End Sub

        Private Function EncontrarInmuebleByCalle(item As Inmueble) As Boolean
            Return (item.Calle = txtCalle.Text)
        End Function
    End Class

    P.D.

    Hace uso de la siguiente clase

    Public Class Inmueble
        Public Property Id As Integer
        Public Property Calle As String
        Public Property Precio As Decimal
        Public Sub New(id As Integer, calle As String, precio As Decimal)
            _Id = id
            _Calle = calle
            _Precio = precio
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos



    martes, 3 de diciembre de 2019 20:32

Todas las respuestas

  • hay varias formas de lograrlo una de ellas es atraves de  una consulta usando linq si no estoy mal seria mas o menos a si

    Module Module1

        Sub Main()
            Dim lista As New List(Of ClaseObjecto)

            lista.Add(New ClaseObjecto With {.Id = 1, .Material = "Vidrio", .Marca = "MarcaA"})
            lista.Add(New ClaseObjecto With {.Id = 2, .Material = "Madera", .Marca = "MarcaB"})
            lista.Add(New ClaseObjecto With {.Id = 3, .Material = "Fierro", .Marca = "MarcaC"})


            Dim query = From datos In lista Select datos.Id, datos.Material, datos.Marca Where Marca = "MarcaB"
        

            For Each result In query
                Console.WriteLine("Id = " & result.Id)
            Next


            Console.ReadLine()
        End Sub

    End Module

    Public Class ClaseObjecto

        Public Property Marca As String
        Public Property Id As Integer
        Public Property Material As String

    End Class






    • Editado DANTE-3D martes, 3 de diciembre de 2019 11:07
    • Propuesto como respuesta Diana AcuñaModerator martes, 3 de diciembre de 2019 15:56
    • Marcado como respuesta James2016-2 martes, 3 de diciembre de 2019 16:43
    martes, 3 de diciembre de 2019 11:02
  • Bueno, gracias esa es otra alternativa interesante.
    martes, 3 de diciembre de 2019 16:43
  • Hola:
    En un Form como el de la imagen


    Copia y pega el siguiente codigo

    Option Strict On
    Option Explicit On

    Public Class Form3
        Private mLista As New List(Of Inmueble)
        Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
            txtId.ReadOnly = True
            txtPrecio.ReadOnly = True
            mLista.Add(New Inmueble(1, "Calle 1", 29920.23D))
            mLista.Add(New Inmueble(2, "Calle 2", 199923.33D))
            mLista.Add(New Inmueble(3, "Calle 3", 288888D))
            mLista.Add(New Inmueble(4, "Calle 4", 282345D))
            mLista.Add(New Inmueble(5, "Calle 5", 54321D))
        End Sub
        Private Sub btnBuscar_Click(sender As Object, e As EventArgs) Handles btnBuscar.Click
            Dim index As Integer = mLista.FindIndex(AddressOf EncontrarInmuebleByCalle)
            If (index = -1) Then
                MessageBox.Show("No existe en la lista el inmueble indicado.")
            Else
                txtId.Text = Convert.ToString(mLista.Item(index).Id)
                txtPrecio.Text = Convert.ToString(mLista.Item(index).Precio)
            End If
        End Sub

        Private Function EncontrarInmuebleByCalle(item As Inmueble) As Boolean
            Return (item.Calle = txtCalle.Text)
        End Function
    End Class

    P.D.

    Hace uso de la siguiente clase

    Public Class Inmueble
        Public Property Id As Integer
        Public Property Calle As String
        Public Property Precio As Decimal
        Public Sub New(id As Integer, calle As String, precio As Decimal)
            _Id = id
            _Calle = calle
            _Precio = precio
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos



    martes, 3 de diciembre de 2019 20:32
  • Gracias, es lo que trataba de hacer.
    • Editado James2016-2 martes, 3 de diciembre de 2019 20:49
    martes, 3 de diciembre de 2019 20:49