So etwas wie eine Berechnungs-Engine für C #?

8

Gibt es eine Berechnungs-Engine für C #, die abhängige Felder automatisch neu berechnen kann, wenn sich ein Wert ändert?

Lass mich für eine Sekunde Freestyle machen, ich stelle mir sowas vor ..

%Vor%

Dies würde Felder einrichten, die abhängige Werte automatisch propagieren.

%Vor%

Offensichtlich ist dies ein einfaches Beispiel, die Endbenutzung wäre den Berechnungen einer komplexen Tabellenkalkulation sehr ähnlich.

Wenn Sie weiter denken, wäre es erstaunlich, wenn das Feld / die Zellen Änderungsbenachrichtigungen unterstützen würden.

    
chillitom 01.02.2011, 16:11
quelle

5 Antworten

5

Hast du Ссылка gesehen?

Es ist erweiterbar, schnell (verfügt z. B. über einen eigenen Cache) und ermöglicht die Bereitstellung benutzerdefinierter Funktionen und Funktionen zur Laufzeit, indem EvaluateFunction / EvaluateParameter-Ereignisse verarbeitet werden. Beispielausdrücke, die es analysieren kann:

%Vor%

Es behandelt auch Unicode & amp; viele Datentypen nativ. Es kommt mit einer Geweihdatei, wenn Sie die Grammatik ändern möchten. Es gibt auch eine Gabel, die MEF unterstützt, um neue Funktionen zu laden.

Es unterstützt auch logische Operatoren, Strings für Datum und Uhrzeit und if-Anweisungen.

eine Lösung

Sie könnten möglicherweise eine automatische Neuberechnung durchführen, indem Sie INotifyPropertyChanged implementieren und dann etwas wie

tun
  • setzt den Ausdruck eines Feldes this.Field.Expression = new Ausdruck ("Field1 + Field2");

On notifypropertyupdated in der Klasse

  • für jedes Feld (mit Reflektion), das eine Funktion
  • ist
  • Wenn sich Ausdruck auf das geänderte Feld bezieht, dann berechnen Sie die Variable neu.
  • Bei der Neuberechnung müssen Sie das EvaluateParameter-Ereignis behandeln, um mithilfe von Reflection das richtige Feld zu finden und dessen Wert zu extrahieren (Sie können zwischenspeichern, um bei Bedarf Reflektionen zu vermeiden)
GreyCloud 01.02.2011, 16:26
quelle
1

Ich habe hier eine ähnliche Frage gestellt: Wahrhaft deklarative Sprache?

Soweit ich weiß, habe ich gerade erst von NCalc gehört, ich werde mich darum kümmern. Ich habe ein Projekt, das ziemlich genau das tut, was du beschreibst, und dann etwas wie das Caching / Cache-Löschen bei Änderungen der Werte oder der Modellstruktur. Überlegen Sie es als eine Überschneidung zwischen einer Datenbank und Excel. Sie können auch Klassen usw. definieren und sie zu großen Modellen mit Millionen von Objekten in Graphen verknüpfen, nicht nur mit Bäumen. Client-Server usw. Außerdem gibt es einen Modelleditor, in dem Sie Modelle in einer Benutzeroberfläche erstellen, sodass Sie analysieren können, wie alle Berechnungen aufeinander aufbauen.

Warum fragen Sie genau?

    
gjvdkamp 01.02.2011 22:05
quelle
1

Ich würde empfehlen, sich auch Jace anzuschauen. Jace ist eine moderne Berechnungs-Engine für das .NET-Framework. Es ist viel schneller als das oben vorgeschlagene NCalc. Außerdem unterstützt es mehr Plattformen (.NET, WinRT, WP7 und WP8).

Weitere Informationen über Jace finden Sie auf der GitHub-Seite: Ссылка

NuGet-Link: Ссылка

    
MuSTaNG 05.12.2012 21:11
quelle
1

Es gibt Berechnungsmodule für skalare Parameter, und es gibt übergeordnete Berechnungsmodule für Tabellen, die typischerweise für Anwendungen wie Finanzplanung, Gebühren- und Provisionsberechnungen, Netzwerk- und Vertragsberechnungen verwendet werden ...

Lassen Sie mich das kurz erklären. Berücksichtigen Sie folgende Formeln für Skalare:

%Vor%

und so weiter. Das Konfigurieren solcher Funktionen und Abhängigkeitsbäume erfordert eine Berechnungs-Engine mit Skalarparametern. Ich würde (auch) folgenden Link für eine solche in c # geschriebene Berechnungsmaschine als guten Ausgangspunkt empfehlen: Ссылка

Wie bereits erwähnt, gibt es auch Berechnungsmaschinen mit Tabellenfunktionen, die Tabellen als Parameter verwenden. Das Hauptprinzip ist aber das gleiche:

%Vor%

und so weiter. Beachten Sie, dass eine Tabellenfunktion mehrere Tabellen als Ausgaben zurückgeben kann, wie oben gezeigt.

Hier sind zwei wichtige Punkte zu beachten:

a) Die Werte der Tabellen T7 und T8 hängen von den Tabellen T2 und T4 ab. Daher müssen die Tabellen T7 und T8 aktualisiert werden, indem die Funktion "TableFunction2" nur dann ausgeführt wird, wenn sich einer der Eingangsparameter T2 oder T4 ändert.

Ähnlich muss T4 nur aktualisiert werden, wenn T1, T2 oder T3 aktualisiert werden; Abhängigkeitsbaum!

b) Trennung der Datenbank vom Berechnungsprozess: Die Berechnungsmaschine muss unabhängig von einer festen Datenstruktur oder einem Datenbankschema arbeiten, damit sie in jede Datenbank und Datenstruktur integriert werden kann.

Sie können meinen verwandten Artikel finden, in dem diese Prinzipien erklärt werden:

Logische Architektur eines regelbasierten Berechnungsframeworks Ссылка

Nun wird basierend auf diesen Prinzipien eine C # /. NET-Bibliothek für eine Berechnungsmaschine mit Tabellen als Eingabe- und Ausgabeparameter entwickelt.

Hinweis für Moderatoren: Bitte löschen Sie den obigen Link, wenn er als Eigenwerbung gezählt wird.

    
tuncalik 20.12.2012 11:55
quelle
-1

Eines der Probleme mit der Effizienz der generischen Regel-Engine ist die Neuberechnung von Summengruppen usw. Stellen Sie sich vor, Sie möchten die Summe der Mehrwertsteuer berechnen. In Ihrem Rechnungsereignis wurde angezeigt, dass sich einige Produkte geändert haben und die Mehrwertsteuer sich geändert hat. Jetzt ist die einfache Lösung, alle Steuern neu zu berechnen. Aber wir können uns eine kluge Lösung vorstellen, von der wir wissen, dass wir in der gegebenen Gruppe den Betrag der Mehrwertsteuer subtrahieren und zu einer anderen Gruppe hinzufügen müssen. Ein anderes Problem sind Zyklen. Wir können verlangen, dass unser Motor einen Teil des Restbetrags berechnet, wenn wir ihn in ein bezahltes Feld eingeben. Und in einem anderen Fall würden wir das bezahlte Feld berechnen wollen, wenn wir es in das Feld, das noch bezahlt werden soll, eingeben. Dies könnte durch ein virtuelles Feld erfolgen, "welches Feld wurde vom Benutzer eingegeben" und wenn in der Regel davon abhängig

    
Marek Mosiewicz 11.03.2018 19:58
quelle

Tags und Links