Wie kann ich das Verhalten von Pythons sortierter integrierter Funktion in C # replizieren?

9

Ich habe eine Liste von Wörterbüchern in Python. Diese Liste wird als JSON zwischen Webdiensten weitergegeben. Diese Web-Services erstellen einzigartige Signaturen basierend auf dem JSON, der herumgereicht wird. Ein Teil des Erstellens der Signatur besteht darin, die Datennutzlast zu normalisieren und sicherzustellen, dass alles in der richtigen Reihenfolge ist, also mache ich das (in Python) - was gut funktioniert.

%Vor%

Nun muss ich eine C # -Anwendung in den Mix einfügen, die dieselbe Signatur wie der Python-Code erzeugen muss. Ich habe die geheime Soße nicht entdeckt, um die obige Datenstruktur auf die gleiche Weise zu sortieren wie Pythons sorted builtin-Funktion.

Ich verwende ServiceStack , um die JSON-Daten zu analysieren.

Ich hatte gehofft, dass es so einfach wäre, so etwas zu machen (in C #):

%Vor%

Allerdings bekomme ich diese Ausnahme vom obigen C # -Code:

%Vor%

Ich verstehe, warum ich diesen Fehler bekomme, aber ich bin mir nicht sicher, was ich dagegen tun soll. Ich hatte wirklich gehofft, dass ich meine eigene Sortierlogik nicht rollen lassen müsste. Die tatsächlichen Daten, mit denen ich es zu tun habe, sind sehr dynamisch. Dies ist nur ein Beispiel für etwas, das mich daran hindert, vorwärts zu gehen.

Hat jemand irgendwelche Vorschläge oder Empfehlungen dazu, wie ich eine Sortierung in C # so wie die sorted python-Funktion für diesen Typ von verschachtelten Datenstrukturen erhalten kann?

Danke!

    
Matthew J Morrison 10.01.2014, 21:46
quelle

3 Antworten

1

Die Beispieldaten sind kein gültiger JSON wie gezeigt. Die Ganzzahl drei kann kein Schlüssel sein, sie muss eine Zeichenfolge sein. Ändern Sie {3: 1} in {"3": 1}

Das zweite Problem ist, dass C # -Wörterbücher standardmäßig nicht bestellbar sind. Sie können sie jedoch von Unterklassen abziehen, um sie bestellbar zu machen.

Der Python2.x-Algorithmus zum Sortieren von Wörterbüchern lautet:

1) Wenn die Wörterbücher unterschiedlich groß sind, ist der kürzere Wert der kleinere Wert.

2) Wenn die Größen identisch sind, scannen Sie das erste Wörterbuch, um den kleinsten Schlüssel im ersten Wörterbuch zu finden, der entweder nicht vorhanden ist oder im zweiten Wörterbuch einen nicht übereinstimmenden Wert hat. Der nicht übereinstimmende Wert bestimmt, welches Wörterbuch das größte ist.

Hier ist der relevante Auszug aus dem Python2.7 Quellcode für Objects / dictobject.c :

%Vor%     
Raymond Hettinger 12.01.2014 19:34
quelle
0

Sie können es umgehen: Rufen Sie die Python-Sortierfunktion aus C # auf, damit Sie genau dasselbe Verhalten haben.

Sie können IronPython verwenden:

Python-Code:

%Vor%

C # -Code:

%Vor%

Komplettes Beispiel hier .

Ссылка

    
phyrox 12.01.2014 19:47
quelle
0

Eine weitere Option ist, die Python-Sortierfunktion über die Befehlszeile in Ihrer C # -App aufzurufen. Sie können diese Methode verwenden:

%Vor%

Weitere Informationen hierzu finden Sie unter: Wie führe ich ein Python-Skript von C # aus? ?

    
phyrox 12.01.2014 19:51
quelle

Tags und Links