COMO FAZER UMA FILTRAGEM EFICIENTE COM STREAM

PROGRAMADORVB6 18/11/2011 14:05:53
#389396
Olá Galera, boa tarde.
Estou com um probleminha nesta rotina pois não consigo fazer uma filtragem eficiente.
Isto é : Fazer com que me filtre de um modo eficiente em uma ListView á medida que vou digitando , independente que no texto a procurar esteja em Maiúsculas ou minúsculas.
Deixo aqui a rotina para que me possam ajudar.


[ô][ô][ô] <summary>
[ô][ô][ô] -------------------------------------
[ô][ô][ô] Função para filtrar em uma ListView.
[ô][ô][ô] -------------------------------------
[ô][ô][ô] <param name=[Ô] Indica_Ficheiro[Ô]>Indicar onde ler o arquivo de texto</param>
[ô][ô][ô] <param name=[Ô]Quadro[Ô]>Nome da ListView a utilizar</param>
[ô][ô][ô] <param name=[Ô]Filtrar_Palavra[Ô]>Pavavra a ser filtrada.</param>
[ô][ô][ô]
[ô][ô][ô] </summary>
Public Sub Filtrar_Dados(ByVal Indica_Ficheiro As String, ByVal Quadro As System.Object, ByRef Filtrar_Palavra As String)
[ô]declara um streamReader e passa o caminho e nome do arquivo texto

Quadro.Items.Clear()
If ExisteFicheiro(Indica_Ficheiro) = True Then
If ContaLinhas(Indica_Ficheiro) = 0 Then Exit Sub
Dim SR As New StreamReader(Indica_Ficheiro)
Try
[ô] variavel que trata as linhas que são lidas
Dim strTemp() As String

Do While SR.Peek <> -1 [ô] Utilize Peek para ler o arquivo até que não haja mais linhas

[ô] cria uma variavel para o ListViewItems
Dim LVItem As New ListViewItem

[ô] Le a proxima linha no arquivo e a separa se estiver usando TAB
strTemp = SR.ReadLine.Split([Ô]|[Ô])

[ô] Extrai o primeiro elemento na linha e atribui os dados a primeira coluna

If strTemp(0).ToString.Contains(Filtrar_Palavra) Then
[ô] Inclui o item no ListView
[ô] Atribui as demais linhas ao subitens
LVItem.Text = strTemp(0).ToString
LVItem.SubItems.Add(strTemp(1).ToString)
LVItem.SubItems.Add(strTemp(2).ToString)
Quadro.Items.Add(LVItem)
ElseIf Filtrar_Palavra = Nothing Then
LVItem.Text = strTemp(0).ToString
LVItem.SubItems.Add(strTemp(1).ToString)
LVItem.SubItems.Add(strTemp(2).ToString)
Quadro.Items.Add(LVItem)
End If

Loop
[ô]SR.Dispose()
[ô] SR.Close() [ô] fehca o StreamReader

Catch ex As Exception
MessageBox.Show([Ô]Erro ao ler o arquivo.[Ô], [Ô]Atenção:[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
SR.Dispose()
SR.Close()
End Try
End If

End Sub


Obrigado desde já pela vossa atenção.
Atenciosamente.
Programadorvb6
KERPLUNK 18/11/2011 16:19:46
#389428
Mostre pra gente como é o tal ficheiro... talvez seja possível carregá-lo de outra maneira para filtrar...
PROGRAMADORVB6 18/11/2011 18:08:15
#389442
Boas Galera!

O ficheiro é em Txt e tem este formato :

Battlefield 3|HJUY-OPIU-FGJ0-HGF3-HJGF||
Call Of Duty MW3|GHFR-POIU-MJKO-865G-H7N3||
The Sims 3|DSRE-HGJK-UYTM-LKJH||
The Sims Medieval: Piratas e Nobres|MNHJ-LOIU-98JH-GFT7||
VBMania - Site|jkjghgdsfjhsdjfh|ProgramadorVB6|
KERPLUNK 18/11/2011 18:40:16
#389446
é vc mesmo quem gera esse arquivo? Se for, troque o [Ô]|[Ô] por ponto-e-vírgula e vai poder abrir esse arquivo como se fosse uma tabela e filtrar normalmente com SQL
SPRITU 19/11/2011 10:04:52
#389475
Bom Dia PROGVB6,

Cara, você pode otimizar a sua pesquisa utilizando arvore binaria.

No momento do Load do Form, você ordena o vetor base ordem alfabetica ou um ID.
Depois vc pode utilizar um algoritmo simples de pesquisa encadeada em arvore (Dividir e conquistar)

Basicamente é um recursão, quebra o vetor no meio e verifica e vai fazendo isso ate finalizar o vetor, vc reduz a metade do tempo, e a eficiecia é bem maior =)

qualquer coisa, da um tok que eu monto um exemplo aqui =)

Tópico encerrado , respostas não são mais permitidas