Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Hybrid View

  1. #1

    VB.net: Cercare Stringa in una lista di Oggetti

    Ciao a tutti.
    ho una STRUCTURE con 2 property: Utente.nome as string e Utente.data as date

    Una lista "ListaNomi"contiene circa 100mila structure, e io avrei bisogno di cercare un nome in questa lista.
    se è presente mi deve date TRUE e se non c'è mi deve dare FALSE.

    ho provato a fare:
    codice:
    if ListaNomi.Contains(stringa) then
       valore = True
    else
       valore = False
    end if
    ma ovviamente mi restituise errore in quanto non può confrontare un Object contro una Stringa.

    Ho provato, senza successo, a fare anche:
    codice:
    Dim controllo As New Utente With {.Nome = stringa}
    If ListaNomi.Contains(controllo) Then
                 valore = True
    Else
                 valore = False
    End If
    Ho risolto eseguendo un ciclo for:
    codice:
    for each item in ListaNomi
         if item.Nome=Stringa then
             valore = True
    C'è qualche istruzione semplice e specifica per fare questo controllo???
    Grazie
    Ultima modifica di Pamela72; 26-01-2018 a 22:20

  2. #2
    Quote Originariamente inviata da Pamela72 Visualizza il messaggio
    Ciao a tutti.
    ho una STRUCTURE con 2 property: Utente.nome as string e Utente.data as date

    Una lista "ListaNomi"contiene circa 100mila structure, e io avrei bisogno di cercare un nome in questa lista.
    se è presente mi deve date TRUE e se non c'è mi deve dare FALSE.

    .....

    Ho risolto eseguendo un ciclo for:
    codice:
    for each item in ListaNomi
         if item.Nome=Stringa then
             valore = True
    C'è qualche istruzione semplice e specifica per fare questo controllo???
    Grazie
    ciao,

    credo si possa fare usando LINQ
    ... qualcosa del genere , ma non ricordo la sintassi esatta per VB.NET:
    codice:
    ListaNomi.Exists (Function(x) x.Nome.Equals(Stringa))
    HTH

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    100000 strutture in memoria??

    Forse stai seguendo una strada sbagliata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Quote Originariamente inviata da oregon Visualizza il messaggio
    100000 strutture in memoria??
    ...
    Azz! ... questo mi era sfuggito

    L'uso di un database mi sembra decisamente meglio

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    con una lista così lunga io non userei un ciclo (ricerca lineare), ma farei una ricerca binaria utilizzando il metodo della lista BinarySearch

    vado un po' a memoria:
    La struttura Utenti dovrebbe implementare l'interfaccia IComparable in modo da poter essere ordinata per Nome. Fatto questo basta fare
    lista.Sort e cercare l'elemento di dato nome con
    Dim o As integer = lista.BinarySearch(New Utenti("nome_cercato", Nothing))

    ps.
    Pietro

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    Direi proprio che devi abbandonare questa strada e usare un dbms
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Allora, cerco di spiegare meglio la situazione.

    Il mio programma è fatto così:
    C'è una lista con circa 150000 nominativi, che viene caricata da un file all'avvio, già in ordine alfabetico. (Structure con 2 property: .nome e .data)

    Esso riceve delle stringhe da un server, che poi vengono spezzettate in 4 substring. Viene creato un oggetto per ogni stringa ricevuta che ha 6 propery, 4 di queste sono le substringhe, l'altre due sono un integer ed un boolean.

    La propery di tipo booleana viene elaborata facilmente, ossia, una di queste substring ricevute dal server contiene una nominativo, che devo per forza verificare se è in quella lista tra le altre 150000 circa.

    Con un ciclo for each funziona tutto perfettamente, non sembrano esserci rallentamenti, ovviamente appena si trova la corrispondenza c'è un Exit For.

    Ho provato con la funzione sugeritami
    codice:
    Dim o As integer = lista.BinarySearch(New Utenti("nome_cercato", Nothing))
    ma mi da errore, mi dice che ci sono troppi argomenti.

    Le liste sono a perdere, ossia quando si chiude il programma si perdono. Vengono caricate al successivo avvio

    Avete altre soluzioni?

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quello di sotto è un esempio semplice. Di più non so.

    codice:
    Option Strict On
    Imports l = libreria.ModuloWeb
    
    Module Module1
    
        Sub Main(args As String())
            Dim lista As New List(Of Utenti)()
            lista.Add(New Utenti("Stefano", #1/1/2018#))
            lista.Add(New Utenti("Carlo", #1/1/2018#))
            lista.Add(New Utenti("Nicola", #1/1/2018#))
            lista.Add(New Utenti("Pietro", #1/1/2018#))
            lista.Sort()
    
            'For Each item As Utenti In lista
            '    Console.WriteLine(item.Nome)
            'Next
    
            ' < 0 => non trovato, altrimenti trova indice
            Dim o As Integer = lista.BinarySearch(New Utenti("pietro", Nothing))
            If o >= 0 Then
                Console.WriteLine("Trovato utente {1} in posizione {0}", o, lista(o).Nome)
            Else
                Console.WriteLine("Non ho trovato utente")
            End If
    
    
            Console.Write("Premere un tasto per continuare . . . ") : Console.ReadKey()
        End Sub
    
    
        Public Structure Utenti
            Implements IComparable(Of Utenti)
    
            Public Property Nome As String
            Public Property Data As DateTime
    
            Public Sub New(nome As String, data As DateTime)
                Me.Nome = nome
                Me.Data = data
            End Sub
    
            Public Function CompareTo(other As Utenti) As Integer Implements System.IComparable(Of Utenti).CompareTo
                Return String.Compare(Me.Nome, other.Nome, True)
            End Function
        End Structure
    
    End Module
    Pietro

  9. #9
    Utente di HTML.it L'avatar di patel
    Registrato dal
    Jan 2008
    Messaggi
    1,994
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Quello di sotto è un esempio semplice. Di più non so.
    A me sembra un ottimo esempio

  10. #10
    Non posso usarlo. Los Strict On (non so cosa sia) mi stravolge parecchie istruzioni. Ad esempio conversioni da Char a String, ed anche altro... mi tirava fuori una sfilza di errori...

    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Quello di sotto è un esempio semplice. Di più non so.

    codice:
    Option Strict On
    Imports l = libreria.ModuloWeb
    
    Module Module1
    
        Sub Main(args As String())
            Dim lista As New List(Of Utenti)()
            lista.Add(New Utenti("Stefano", #1/1/2018#))
            lista.Add(New Utenti("Carlo", #1/1/2018#))
            lista.Add(New Utenti("Nicola", #1/1/2018#))
            lista.Add(New Utenti("Pietro", #1/1/2018#))
            lista.Sort()
    
            'For Each item As Utenti In lista
            '    Console.WriteLine(item.Nome)
            'Next
    
            ' < 0 => non trovato, altrimenti trova indice
            Dim o As Integer = lista.BinarySearch(New Utenti("pietro", Nothing))
            If o >= 0 Then
                Console.WriteLine("Trovato utente {1} in posizione {0}", o, lista(o).Nome)
            Else
                Console.WriteLine("Non ho trovato utente")
            End If
    
    
            Console.Write("Premere un tasto per continuare . . . ") : Console.ReadKey()
        End Sub
    
    
        Public Structure Utenti
            Implements IComparable(Of Utenti)
    
            Public Property Nome As String
            Public Property Data As DateTime
    
            Public Sub New(nome As String, data As DateTime)
                Me.Nome = nome
                Me.Data = data
            End Sub
    
            Public Function CompareTo(other As Utenti) As Integer Implements System.IComparable(Of Utenti).CompareTo
                Return String.Compare(Me.Nome, other.Nome, True)
            End Function
        End Structure
    
    End Module

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.