Wie für die Durchführung des Beschlusses matrix in c#
Muss ich eine Entscheidung treffen, basierend auf einer ziemlich großen Gruppe von 8 co-abhängigen Bedingungen.
| A | B | C | D | E | F | G | H
-----------+---+---+---+---+---+---+---+---
Decision01 | 0 | 1 | - | 1 | 0 | 1 | - | 1
Decision02 | 1 | 0 | - | 0 | 0 | - | 1 | -
...
Decision11 | 1 | 0 | 1 | 1 | 1 | - | 1 | 1
Jede der Bedingungen A bis H true (1) false (0) oder nicht-relevant (-) für die Entscheidung.
Also mit einem gegebenen input der
A B C D E F G H
1 0 1 0 0 1 1 1
sollte es bewerten zu Decision02.
Die Entscheidungen sind eindeutig, so dass aus jeder gegebenen Menge von input-Bedingungen ist es klar, welche Entscheidung getroffen werden muss (und in einem Fall, der nicht bedeckt durch die matrix, wird eine Ausnahme geworfen werden soll).
Entwickler gearbeitet, bevor Sie mich auf dieses Projekt versucht zu implementieren, das als ein 500-Linie lange verschachtelte wenn-behemoth, die natürlich ist buggy wie die Hölle und ist nicht reparierbar.
So suchte ich für den besten Weg zur Umsetzung einer solchen Logik, und ich bin gekommen, die auf entscheidungstabellen/lookup tables/Tabellen-Steuerelement.
Habe ich eine ganze Menge gefunden-entscheidungstabelle-Generatoren, aber nicht ein einziges Stück code auf, wie die Umsetzung der Entscheidungsprozess 🙁
Ich kann die Entscheidung treffen-Tabelle in der zugrunde liegenden MSSQL-Datenbank oder im code, oder xml, oder was auch immer es nimmt. Ich brauche nur einige Hinweise, wie zu implementieren ist.
Was ist die best practice zur Umsetzung dieser Logik? Wörterbuch? Mehrdimensionales array? Etwas völlig anderes?
- Nullable boolean ist, wo ich anfangen würde... bool? Kann sein true, false oder null
- Durch - er bedeutet, dass es nicht wichtig ist, zB es kann 1 oder 0 sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man es machen, mit arrays von Func.
Nun könnte man die matrix in ein Wörterbuch wie dieses:
Schließlich für jede gegebene Eingabe-array:
Diesem sollte wohl einiges mehr Kontrollen (z.B. Kontrolle, dass die Eingabe-array hat die richtige Größe), aber sollte Ihnen eine Vorstellung. Mit Funcs gibt Ihnen auch etwas mehr Flexibilität in den Fall, Sie bekommen ein vierter Zustand.
string
und Ihrebool
"Ergebnis"Ich würde ein 2D-array (
Dictionary<TKey, TValue>
in unserem Fall) vonbool?
- beachten Sie die ? fürNullable<bool>
die können 3 Zustände: true, false und null. Ihre null darstellen könnte "keine Wirkung"...Definierten array:
Dann könnten Sie Dinge tun, wie:
&
mit der false immer false...Dies ist, wie ich es tun würde, mit meiner Liebe von LINQ.
Zuerst, Ihre Matrizen sind ein
IEnumerable<IEnumerable<bool?>>
, undtrue
bedeutet 1,false
0 undnull
unbestimmt.Dann passieren Sie eine
IEnumerable<bool>
die Sie überprüfen möchten. Hier ist die Funktion:(Es ist eine Erweiterung Methode, steckte es in eine
static class
🙂 )Können Sie eine Entscheidung, Klasse dargestellt mit zwei byte-Felder. Das erste byte wird festgelegt, welche Bedingungen sind true oder false. Das zweite byte wird festgelegt, welche Bedingungen relevant sind. Darüber hinaus können Sie eine Funktion definieren, die bestimmt, ob ein Eingangs-byte entspricht einem Objekt.
Daraus könnte erstellen Sie eine matrix-Klasse die wraps eine Liste der Entscheidungen, dann verwendet LINQ to suchen Sie in der Liste für eine Entscheidung, die mit Ihrem input.
Können Sie haben Sie die Entscheidung Klasse, wie diese
So, in dem das Objekt für Decision01 kann definiert werden als
Dann Ihre Entscheidung, Matrix-Klasse vorgenommen werden können, wie dies
Kann es auch helfen, um eine Input-Klasse, wickelt in einem byte. Wenn Sie instanziieren Sie ein Eingabe-Objekt mit dem A-H-Felder, ein byte wird erstellt, um mit diesen Feldern.
Implementieren Sie die matrix als ein Wörterbuch, wie unten gezeigt, und eine Abfrage auf die matrix um eine übereinstimmung zu finden. Ich habe verwendet, string.beitreten und konvertieren Sie das array in einen string. Auch das '-' in der matrix als ein regex [0/1].
Könnte man es machen, in ein paar Zeilen und erstellen Sie einen binären Rechner. Also in einem Beispiel unten, die Ergebnisse = 182 als Entscheidung D (oder das, was jeder). Die unten, reiht sich mit Ihren Entscheidungen und Ergebnisse, die alle unterschiedliche Summen.
Hier ist eine website, geht über die Binäre [http://electronicsclub.info/counting.htm] Dank google.
Beispielsweise 10110110 in Binär ist gleich 182 in dezimal:
Ziffer Wert: 128 64 32 16 8 4 2 1
Binäre Zahl: 1 0 1 1 0 1 1 0
Decimal-Wert: 128 + 0 + 32 + 16 + 0 + 4 + 2 + 0 = 182