2011-12-24 16 views
7

Ho circa 10.000 record. Ogni record ha 2 campi: un campo è una stringa lunga fino a 300 caratteri e l'altro campo è un valore decimale. Questo è come un catalogo di prodotti con nomi di prodotti e il prezzo di ciascun prodotto.Che tipo di collezione dovrei usare?

Quello che devo fare è consentire all'utente di digitare qualsiasi parola e visualizzare tutti i prodotti che contengono quella parola insieme ai loro prezzi in una lista. È tutto.

  1. Che tipo di raccolta è la migliore per questo scenario?
  2. Se devo ordinare in base al nome o al prezzo del prodotto, la scelta sarà ancora la stessa?

In questo momento sto utilizzando un file XML, ma ho pensato che l'utilizzo di una raccolta in modo da poter incorporare tutti i valori nel codice sia più semplice. Grazie per i vostri suggerimenti.

+0

Si prega di non inserire C# nel titolo. Questo è ciò che i tag sono per. – Amy

+0

Non una raccolta: è possibile utilizzare SQLLite per archiviare i dati e accedervi. –

risposta

10

Un dizionario farà il lavoro. Tuttavia, se stai eseguendo rapide corrispondenze parziali (ad es. Cerca come l'utente digita) potresti ottenere prestazioni migliori creando più chiavi che puntano allo stesso oggetto. Ad esempio, la parola "Apple" potrebbe essere posizionata con "Ap", "App", "Appl" e "Apple".

Ho utilizzato questo approccio su un numero simile di record con risultati molto buoni. Ho trasformato i miei articoli sorgente 10K in circa 50K di chiavi univoche. Ciascuna di queste voci del dizionario punta a un elenco contenente riferimenti a tutte le corrispondenze per quel termine. È quindi possibile cercare in questo elenco molto più piccolo in modo più efficiente. Nonostante il gran numero di liste create, l'impronta della memoria è abbastanza ragionevole.

È anche possibile creare le proprie chiavi se si desidera reindirizzare gli errori di ortografia comuni o scegliere elementi correlati. Ciò elimina anche la maggior parte dei problemi con chiavi univoche perché ogni chiave punta a un elenco. Un singolo oggetto può essere classificato da ciascuna delle parole nel suo nome; questo è estremamente utile se si hanno nomi di prodotti lunghi con più parole. Quando classifichi i tuoi articoli, ogni parola nel nome può essere mappata su una o più chiavi.

Devo anche sottolineare che la costruzione e la classificazione di articoli 10K non dovrebbe richiedere molto tempo se eseguita correttamente (un paio di centinaia di millisecondi è ragionevole). I risultati possono essere memorizzati nella cache fino a quando si desidera utilizzare Application, Cache o membri statici.

Per riassumere, la struttura risultante è una Dictionary<string, List<T>> in cui la stringa è breve (2-6 caratteri funziona bene) ma una chiave univoca. Ogni chiave punta a un List<T> (o altra raccolta, se si è così inclini) di elementi che corrispondono a quella chiave. Quando viene eseguita una ricerca, si individua la chiave che corrisponde al termine fornito dall'utente. A seconda della lunghezza delle chiavi, è possibile troncare la ricerca dell'utente alla lunghezza massima della chiave. Dopo aver individuato la raccolta figlio corretta, puoi cercare quella raccolta per una corrispondenza completa o parziale utilizzando qualsiasi metodo desideri.

Infine, è possibile creare una struttura leggera per ciascun elemento nell'elenco in modo da poter memorizzare ulteriori informazioni sull'elemento. Ad esempio, potresti creare una piccola classe di prodotti che memorizza il nome, il prezzo, il dipartimento e la popolarità del prodotto. Questo può aiutarti a perfezionare i risultati che mostri all'utente.

Tutto sommato, è possibile eseguire ricerche intelligenti, dettagliate e sfocate in tempo reale.

Le strutture di cui sopra devono fornire una funzionalità all'incirca equivalente a trie.

+1

+1 per suggerire una classe di prodotto, mostrando un approccio alla corrispondenza parziale e prendendosi il tempo per scrivere una risposta utile – Adam

9

10K record non è molto.

Un Dictionary<string,decimal> corrisponde al conto. Puoi ordinare per chiave o per valore usando LINQ, così come le ricerche.

Ciò presuppone che i nomi dei prodotti siano unici.

+0

Sono d'accordo, ma penso che valga anche la pena sottolineare che funzionerà solo se tutte le stringhe sono uniche. – madd0

+0

@ madd0 - Punto giusto. Risposta aggiornata – Oded

+0

+1 e Qualsiasi limite quando dovremmo smettere di usare Dictionary o quando sarà troppo lento per essere efficace? –

Problemi correlati