3 Stimmen

Wie kann ich in C# eine Schleife in einem 2D-Gitter-Entscheidungsbaum erstellen?

Ich habe eine Liste von Objekten, die ich muss eine Eigenschaft auf der Grundlage von zwei Kriterien das 2D-Gitter sieht wie folgt:

Property 2\Property 1   B<80        80<B<100       100<B<120           B>120
A < 100                 None          Red           Orange            Orange
100 < A < 120           None          Red           Orange             Green
120 < A < 140           None          Red           Green              Green
140 < A                 None         Orange         Green              Green

Gibt es eine gute Möglichkeit, Schleife Eigenschaft 1 und Eigenschaft 2, um die Objekteigenschaft dynamisch festgelegt? Es besteht die Möglichkeit, dass wir in Zukunft einige Kriterien hinzufügen, und ich vermute, dass die Verwendung mehrerer ifs keine gute Lösung ist. Ich versuche, redundanten Code zu vermeiden.

Danke

2voto

Godeke Punkte 15741

Ich würde empfehlen, ein Array Lookup zu verwenden, wenn Sie vermuten, dass sich die Dinge häufig ändern werden. Am besten wäre es, die Daten aus einer Datenbank oder einer externen Datei zu laden (um die Konfiguration zu erleichtern), aber hier habe ich die Arrays hart kodiert:

        int[] alimits = new int[] { 100, 120, 140, int.MaxValue };
        int[] blimits = new int[] { 80, 100, 120, int.MaxValue };
        int aval = 125;
        int bval = 110;

        int aindex = 0;
        for (int i = 0; i < alimits.Count(); i++)
            if (aval < alimits[i])
                aindex = i;

        int bindex = 0;
        for (int i = 0; i < blimits.Count(); i++)
            if (bval < blimits[i])
                bindex = i;

        string[,] values = new string[,] {
            {"None", "Red", "Orange", "Orange"}, 
            {"None", "Red", "Orange", "Green"},
            {"None", "Red", "Green", "Green"},
            {"None", "Orange", "Green", "Green"}};

Dies ist ungetestet, sollte Ihnen aber die Grundidee vermitteln. Sie erhalten das Ergebnis als values[aindex, bindex] .

0voto

Ali Lown Punkte 2267

Wenn wir die 2 Bedingungen für A und B in ein System mit einer Skala von 0-3 umwandeln könnten:
wenn A<100 -> Ascale = 0
sonst wenn A<120 -> Ascale = 1
usw. und für B:
wenn B<80 -> Bscale = 0
else if B<100 -> Bscale = 1
usw.

Dann könnten wir ein 2d-Array verwenden, um die richtige Ausgabeantwort zu finden:
out = arrayname[Ascale][Bscale];

Aber ich glaube nicht, dass dies etwas über einfach hard-coding es als wenns spart, wenn nur die Möglichkeit, ein paar zusätzliche, ich denke, dass hard-coding ist die beste Lösung für diese.

0voto

Tigran Punkte 60618

Class AbstractSetter { void SetObjectProperty(); }

class SetterLessThen100 : AbstractSettter { /* Implementierungscode für den Fall A<100 */}

Implementieren Sie eine Liste von Setter-Objekten, die für jeden verfügbaren Fall auf das Objekt einwirken. Fügen Sie alle diese Objekte der AbstractSetters-Sammlung hinzu, iterieren Sie darüber und rufen Sie die abstrakte Methode SetProperty() auf (Überladung für jedes konkrete Objekt). Und in der Zukunft, wenn Sie eine andere Bedingung hinzufügen möchten, genügt es, einen neuen Setter zu implementieren und ihn der AbstractSetters-Sammlung hinzuzufügen.

Sorry, ich habe nicht genug Zeit, um den ganzen Code zu schreiben, hoffe, es ist klar. Viel Glück!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X