Welche Art von Sammlung sollte ich verwenden?

7

Ich habe ungefähr 10.000 Datensätze. Jeder Datensatz hat 2 Felder: Ein Feld ist eine Zeichenfolge mit bis zu 300 Zeichen Länge und das andere Feld ist ein Dezimalwert. Dies ist wie ein Produktkatalog mit Produktnamen und dem Preis jedes Produkts.

Was ich tun muss, ist, dass der Benutzer ein beliebiges Wort eingeben und alle Produkte, die dieses Wort enthalten, zusammen mit seinen Preisen in einer Listbox anzeigen kann. Das ist alles.

  1. Welche Art von Sammlung eignet sich am besten für dieses Szenario?
  2. Wenn ich nach Produktname oder Preis sortieren muss, ist die Wahl immer noch dieselbe?

Im Moment verwende ich eine XML-Datei, aber ich dachte, eine Sammlung zu verwenden, damit ich alle Werte in den Code einbetten kann, ist einfacher. Danke für deine Vorschläge.

    
user763554 24.12.2011, 08:08
quelle

2 Antworten

10

Ein Wörterbuch wird den Job machen. Wenn Sie jedoch schnelle Teilübereinstimmungen durchführen (z. B. die Suche nach den Benutzertypen), erzielen Sie möglicherweise eine bessere Leistung, wenn Sie mehrere Schlüssel erstellen, die auf dasselbe Element zeigen. Zum Beispiel könnte das Wort "Apple" mit "Ap", "App", "Appl" und "Apple" gefunden werden.

Ich habe diesen Ansatz für eine ähnliche Anzahl von Datensätzen mit sehr guten Ergebnissen verwendet. Ich habe meine 10K-Quellen in ungefähr 50K eindeutige Schlüssel umgewandelt. Jeder dieser Dictionary-Einträge verweist auf eine Liste, die Verweise auf alle Übereinstimmungen für diesen Begriff enthält. Sie können dann diese viel kleinere Liste effizienter durchsuchen. Trotz der großen Anzahl von Listen, die dies erzeugt, ist der Speicherbedarf ziemlich vernünftig.

Sie können auch eigene Schlüssel erstellen, wenn Sie häufig verwendete Rechtschreibfehler umleiten oder auf verwandte Elemente verweisen möchten. Dies beseitigt auch die meisten Probleme mit eindeutigen Schlüsseln, da jeder Schlüssel auf eine Liste zeigt. Ein einzelner Gegenstand kann durch jedes der Wörter in seinem Namen klassifiziert werden; Dies ist sehr nützlich, wenn Sie lange Produktnamen mit mehreren Wörtern haben. Wenn Sie Ihre Elemente klassifizieren, kann jedes Wort im Namen einer oder mehreren Schlüssel zugeordnet werden.

Ich sollte auch darauf hinweisen, dass das Erstellen und Klassifizieren von 10K-Elementen nicht lange dauern sollte, wenn es richtig gemacht wird (ein paar Hundert Millisekunden sind vernünftig). Die Ergebnisse können so lange wie gewünscht mit Application , Cache oder statischen Elementen zwischengespeichert werden.

Zusammenfassend ist die resultierende Struktur ein Dictionary<string, List<T>> , wobei die Zeichenkette eine Kurzform ist (2-6 Zeichen funktioniert gut), aber ein eindeutiger Schlüssel. Jeder Schlüssel zeigt auf ein List<T> (oder eine andere Sammlung, wenn Sie so geneigt sind) von Elementen, die mit diesem Schlüssel übereinstimmen. Wenn eine Suche durchgeführt wird, suchen Sie den Schlüssel, der dem vom Benutzer angegebenen Begriff entspricht. Abhängig von der Länge Ihrer Schlüssel können Sie die Suche des Benutzers auf die maximale Schlüssellänge beschränken. Nachdem Sie die korrekte untergeordnete Sammlung gefunden haben, durchsuchen Sie diese Sammlung nach einer vollständigen oder teilweisen Übereinstimmung mit der von Ihnen gewünschten Methode.

Zu guter Letzt möchten Sie möglicherweise eine leichtgewichtige Struktur für jedes Element in der Liste erstellen, damit Sie zusätzliche Informationen über das Element speichern können. Sie können beispielsweise eine kleine Produktklasse erstellen, in der Name, Preis, Abteilung und Beliebtheit des Produkts gespeichert sind. Dies kann Ihnen helfen, die Ergebnisse zu verfeinern, die Sie dem Benutzer zeigen.

Alles in allem können Sie intelligente, detaillierte, unscharfe Suchen in Echtzeit durchführen.

Die oben genannten Strukturen sollten eine Funktionalität bieten, die in etwa einem trie entspricht.

    
Tim Medora 24.12.2011, 08:24
quelle
9

10K Datensätze sind nicht so viel.

Ein Dictionary<string,decimal> würde die Rechnung passen. Sie können nach Schlüssel oder nach Wert mit LINQ sortieren sowie Suchen durchführen.

Dies setzt voraus, dass Produktnamen eindeutig sind.

    
Oded 24.12.2011 08:12
quelle

Tags und Links