Was ist die beste C # Datenstruktur für die folgende Situation?

8

Die Anforderungen für meine Anwendung sind wie folgt. Ich muss Aufträge speichern, die wie folgt aussehen:

  • Jede Bestellung bezieht sich auf einen bestimmten Stockcode (String) und hat einen Preis, ein Volumen und ob sie gekauft oder verkauft wird (boolean) oder nicht.

  • Ich muss mehrere Operationen für alle Aufträge ausführen, die zu einem bestimmten Bestand gehören, z. B. die Summe des Auftragsvolumens für den Lagerbestand "abc".

  • Ich muss in der Lage sein, der Datenstruktur eine Reihenfolge hinzuzufügen

  • Ich muss in der Lage sein, eine Bestellung aus der Datenstruktur zu entfernen

  • Ich muss herausfinden können, welche Bestellung den besten Preis anbietet, nachdem eine Bestellung hinzugefügt oder entfernt wurde.

Hier ist was ich bisher denke:

%Vor%

Und dann würde ich die Bestellungen in einem Dictionary & lt; String, List & lt; Order & gt; & gt; speichern. Wo jeder Aktiencode ein Schlüssel im Wörterbuch wäre, der auf eine Liste von Aufträgen für diesen Bestand zeigt. Ich würde auch das Wörterbuch halten, das einer Bestellungs-ID zu einem Lagerkode entspricht.

  • Zum Hinzufügen eines neuen Auftrags finde ich einfach die passende Liste von Aufträgen im Wörterbuch basierend auf dem aktuellen Lagercode und füge die Bestellung ein. Ich würde auch einen Eintrag in dem Orderstock-Wörterbuch hinzufügen, der der aktuellen Reihenfolge mit der passenden Liste entspricht.

  • Um den besten Preis zu finden, suche ich im Wörterbuch die Bestellliste nach dem aktuellen Lagercode, sortiere die Liste und drucke die höchste.

  • Das Entfernen ist schwierig. Ich müsste zuerst die entsprechende Liste nach dem Lagercode suchen. Ich müsste dann alle Bestellungen für diesen Lagerbestand durchlaufen und den mit der aktuellen Auftrags-ID übereinstimmen und ihn entfernen. Dies ist offensichtlich ineffizient, wenn für den aktuellen Lagerbestand viele Bestellungen vorliegen. Ist dies der beste Weg, diese Informationen zu speichern?

Matt Wolin 13.04.2012, 23:12
quelle

3 Antworten

1

Wenn Sie dies mit vielen Daten tun, legen Sie es in eine Datenbank. Dies ist nicht etwas, was Sie in einer Klasse tun möchten.

Wenn Sie jedoch eine kleine Menge von Daten verwenden, können Sie dies mit LINQ im Code tun.

Ich denke, Sie sollten Order implementieren IEnumerable und dann ein List<Order> verwenden, um Ihre Bestellungen zu speichern. Machen Sie StockCode zu einer öffentlichen Eigenschaft in Order und anschließend können Sie Aufträge mit Linq abrufen:

%Vor%

Das Entfernen von Elementen aus der Liste ist ziemlich einfach:

%Vor%

Das Finden zum besten Preis mit Linq ist ganz nett:

%Vor%

Weitere großartige LINQ-Tricks finden Sie unter 101 LINQ-Beispiele .

    
Paul Oliver 13.04.2012, 23:27
quelle
1

Ich würde ein zusätzliches Wörterbuch hinzufügen, das aus key = orderid, value = Referenz zur Bestellung in der Liste im ursprünglichen Wörterbuch der Lagercodes besteht.

Dies wird wie ein Index funktionieren und Ihnen eine konstante Zeitlöschung geben. Unter der Annahme, dass die Auftrags-ID eindeutig ist, wird sie 1: 1 zugeordnet. Stellen Sie sicher, dass Sie es aus beiden Wörterbüchern löschen.

Wie in Kommentaren vorgeschlagen, würde ich ein zusätzliches Wörterbuch der berechneten Summen empfehlen, die Sie nach Lagerbestandscode benötigen. Dadurch wird der konstante Zeitzugriff für den Speicher abgewickelt. Wenn die Erinnerung kein Problem ist, scheint es günstig zu sein, es jedes Mal zu berechnen, wenn Sie es brauchen. Wenn Sie eine neue Bestellung erhalten, können Sie einfach die Summen, Durchschnittswerte usw. aktualisieren. Denken Sie nur daran, dass Sie, wenn Sie parallel arbeiten, eine Sperre benötigen, um sicherzustellen, dass Sie keine Probleme haben.

    
Jordan 13.04.2012 23:47
quelle
0

Ich stimme den Kommentaren zu, dass eine Datenbank die beste Option wäre; Sie sind für diese Art von Dingen konzipiert.

Wenn Sie diese Daten im Speicher behalten müssen, und es gibt wirklich viele Bestellungen pro Code, dann würde ich mit einem Dictionary<string, SortedSet<Order>> gehen. SortedSet erleichtert die Suche nach Min / Max sowie das schnelle Einfügen / Entfernen.

    
Servy 13.04.2012 23:30
quelle

Tags und Links