Usuário com melhor resposta
Pesquisa em um New List(Of com Varias propriedades

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
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 :
- Sugerido como Resposta Ricardo Barbosa Cortes quinta-feira, 5 de junho de 2014 19:45
- Marcado como Resposta Ricardo Barbosa Cortes sexta-feira, 6 de junho de 2014 18:36
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
-
-
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 ?
-
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 :
-
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 ?
-
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 :
- Sugerido como Resposta Ricardo Barbosa Cortes quinta-feira, 5 de junho de 2014 19:45
- Marcado como Resposta Ricardo Barbosa Cortes sexta-feira, 6 de junho de 2014 18:36
-