none
Pesquisa em um New List(Of com Varias propriedades RRS feed

  • Pergunta

  • Pessoal

        Como faria para pesquisa em um New List(Of onde tem várias propriedades, tanto poderia ser por indexof, where, find ou outra forma ?

    Com base no codigo abaixo eu queria pesquisa o id_chave_controle = 12813

    Public Class clsCliente
       Public Property id_Chave_Controle() As Integer
       Public Property nm_Cliente() As String
       Public Property vl_Documento() As String
       Public Property qt_Documento() As Integer
    End Class
    
    
    Public Class frmTrabalhando_Classe
    
       Private cl_Cliente_List As New List(Of clsCliente)
       Dim cl_Cliente As clsCliente
    
       Private Sub btn_Grava_Click(sender As System.Object, e As System.EventArgs) Handles btn_Grava.Click
          Try
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12810
             cl_Cliente.nm_Cliente = "Nome Cliente 12810"
             cl_Cliente.vl_Documento = 12810.25
             cl_Cliente.qt_Documento = 1210
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12811
             cl_Cliente.nm_Cliente = "Nome Cliente 12811"
             cl_Cliente.vl_Documento = 12811.25
             cl_Cliente.qt_Documento = 1211
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12812
             cl_Cliente.nm_Cliente = "Nome Cliente 12812"
             cl_Cliente.vl_Documento = 12812.25
             cl_Cliente.qt_Documento = 1212
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12813
             cl_Cliente.nm_Cliente = "Nome Cliente 12813"
             cl_Cliente.vl_Documento = 12813.25
             cl_Cliente.qt_Documento = 1213
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12814
             cl_Cliente.nm_Cliente = "Nome Cliente 12814"
             cl_Cliente.vl_Documento = 12814.25
             cl_Cliente.qt_Documento = 1214
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12815
             cl_Cliente.nm_Cliente = "Nome Cliente 12815"
             cl_Cliente.vl_Documento = 12815.25
             cl_Cliente.qt_Documento = 1215
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12816
             cl_Cliente.nm_Cliente = "Nome Cliente 12816"
             cl_Cliente.vl_Documento = 12816.25
             cl_Cliente.qt_Documento = 1216
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12817
             cl_Cliente.nm_Cliente = "Nome Cliente 12817"
             cl_Cliente.vl_Documento = 12817.25
             cl_Cliente.qt_Documento = 1217
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12818
             cl_Cliente.nm_Cliente = "Nome Cliente 12818"
             cl_Cliente.vl_Documento = 12818.25
             cl_Cliente.qt_Documento = 1218
             cl_Cliente_List.Add(cl_Cliente)
    
             cl_Cliente = New clsCliente()
             cl_Cliente.id_Chave_Controle = 12819
             cl_Cliente.nm_Cliente = "Nome Cliente 12819"
             cl_Cliente.vl_Documento = 12819.25
             cl_Cliente.qt_Documento = 1219
             cl_Cliente_List.Add(cl_Cliente)
    
          Catch ex As Exception
    
          End Try
       End Sub
    

    quinta-feira, 5 de junho de 2014 09:31

Respostas

  • Pessoal

        Desde já quero agradeço pelas informações, mais algumas dúvidas :

    1) Quando utilizo o binarysearch, ele não seria mais rápido devido ele aproveitar a ordenação do list, tipo aquele esquema de busca binaria ?

    2) E aproveitando as outras dicas informadas, qual eu teria melhor performance de retorno sabendo que nunca terei informação em duplicidade, buscando pela propriedade id_chave_controle, FirstOrDefault, FindIndex ou teria outro mais eficiente ?

     1- Caso implemente a interface IComparer o BynariSearch é mais rápido !

     2- Use o  First pois o FindIndex implementa um for também em sua definição e também o predicado com isso fica mais lento do que usando o First veja essa discussão sobre :

    Busca em List<t>lenta usando FindIndex !!</t>

    quinta-feira, 5 de junho de 2014 19:17

Todas as Respostas

  • Olá neibala,

      você pode utilizar o método FirstOrDefault para encontrar um unico registro, ou seja caso encontre na condição ele retorna caso não encontrar retorna nulo veja :

    'busca um unico Cliente com id cHave controle = 12818
            Dim buscaCliente As clsCliente = cl_Cliente_List.FirstOrDefault(Function(i As clsCliente) i.id_Chave_Controle = 12818)
    
            If Not buscaCliente Is Nothing Then
    
                'o metodo FIrstOrDefault traz o registro se for encontrado
                'caso não encontre na condicao especifica retorna Nulo
    
            End If

    quinta-feira, 5 de junho de 2014 10:34
  • Olá amigo, caso queira retornar apenas um registro você poderá utilizar o FirstOrDefault, que retorna um item ou nulo caso não encontre nada com sua condição.

    Para o caso de querer mais de um item, utilize Where

    Abraços!

    quinta-feira, 5 de junho de 2014 12:33
  • Pessoal

       Muito interessante está questão da pesquisa por FirstOrDefault, e até mesmo pelo Where, mais uma dúvida percebi que ele está passando por todos os dados do list, como seria utilizando Binarysearch, tentei utilizar mais acredito que deve estar faltando algo, alguém teria algum exemplo para me enviar com base na minha estrutura ?

    quinta-feira, 5 de junho de 2014 13:01
  • Pessoal

       Muito interessante está questão da pesquisa por FirstOrDefault, e até mesmo pelo Where, mais uma dúvida percebi que ele está passando por todos os dados do list, como seria utilizando Binarysearch, tentei utilizar mais acredito que deve estar faltando algo, alguém teria algum exemplo para me enviar com base na minha estrutura ?

     neibala,

     usando o BinarySearch, você terá que implementar a interface IComparer e definir o item da classe que será comparado e quando fizer a busca utilizando BinarySearch ele vai comparar item a item, resumindo vai dar na mesma ! 

     Mas caso queira implemente a interface e faça os testes veja exemplo :

    Implementando consulta usando BinarySearch

    quinta-feira, 5 de junho de 2014 13:15
  • Pessoal

        Desde já quero agradeço pelas informações, mais algumas dúvidas :

    1) Quando utilizo o binarysearch, ele não seria mais rápido devido ele aproveitar a ordenação do list, tipo aquele esquema de busca binaria ?

    2) E aproveitando as outras dicas informadas, qual eu teria melhor performance de retorno sabendo que nunca terei informação em duplicidade, buscando pela propriedade id_chave_controle, FirstOrDefault, FindIndex ou teria outro mais eficiente ?

    quinta-feira, 5 de junho de 2014 14:20
  • Pessoal

        Desde já quero agradeço pelas informações, mais algumas dúvidas :

    1) Quando utilizo o binarysearch, ele não seria mais rápido devido ele aproveitar a ordenação do list, tipo aquele esquema de busca binaria ?

    2) E aproveitando as outras dicas informadas, qual eu teria melhor performance de retorno sabendo que nunca terei informação em duplicidade, buscando pela propriedade id_chave_controle, FirstOrDefault, FindIndex ou teria outro mais eficiente ?

     1- Caso implemente a interface IComparer o BynariSearch é mais rápido !

     2- Use o  First pois o FindIndex implementa um for também em sua definição e também o predicado com isso fica mais lento do que usando o First veja essa discussão sobre :

    Busca em List<t>lenta usando FindIndex !!</t>

    quinta-feira, 5 de junho de 2014 19:17
  • Daniel

        E qual seria a forma mais correta de eu implementar o Icomparer, com base na minha estrutura ?

    sexta-feira, 6 de junho de 2014 21:45