Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  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,462
    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,462
    Direi proprio che devi abbandonare questa strada e usare un dbms
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Direi proprio che devi abbandonare questa strada e usare un dbms
    non so. Se la lista è fissa, o immutabile per un tempo diciamo un anno, forse ha senso serializzarla in un file, e deserializzarla all'apertura del programma (io ho utilizzato questo metodo con la lista comuni).
    Qui, il problema è: ho una lista di oggetti in memoria. Come posso velocemente ricercare un elemento?
    La cosa interessante per me, è come il .NET risolve: interfacce, linq, etc
    Pietro

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Per me invece la prima cosa su cui bisogna porre attenzione é "sto facendo delle buone scelte"?

    il fine non deve essere scrivere codice perché "comunque .net lo può fare", ma scrivere codice efficiente per avere programmi veloci e fare in modo che gli utenti siano soddisfatti.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Per me invece la prima cosa su cui bisogna porre attenzione é "sto facendo delle buone scelte"?

    il fine non deve essere scrivere codice perché "comunque .net lo può fare", ma scrivere codice efficiente per avere programmi veloci e fare in modo che gli utenti siano soddisfatti.
    condivido appieno
    Pietro

  10. #10
    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?

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.