Algoritmo C # in grado di leggere espressioni logiche speciali

0

Ho bisogno di implementare un algoritmo di operazioni logiche speciali. L'attività è stata assegnata per memorizzare le condizioni logiche in un database e il codice C # ha letto le informazioni e selezionato il risultato corretto.

Ecco lo scenario: Questa azienda utilizza quello che chiamano un codice di configurazione per tutti i loro prodotti. Il codice di configurazione è tipicamente di 50 cifre, ma in rari casi può essere più lungo.
Sulla base di determinati valori di cifre all'interno del codice di configurazione, dovrò selezionare una versione specifica del software.

Diciamo che le cifre 5-7 nel codice di configurazione devono essere 'LLP', E la cifra 9 deve essere X o Y. Ciò porterebbe ad una versione software di v01.1.1. L'operazione logica sarebbe simile a questa [(D5-7 = 'LLP' & D & D9 = 'X') || (D5-7 = 'LLP' & D9 = 'Y')], dove D = Il valore della cifra nel codice di configurazione.

Il codice C # deve essere in grado di leggere l'espressione e determinare il codice di versione. Potrei scrivere questo nel codice C # nativo, ma il cliente non vuole cambiare l'applicazione C # ogni volta che c'è una nuova versione. Il database stesso non sarebbe grande, probabilmente con meno di 100 record. Come faccio a progettare e implementare un algoritmo che leggerà le espressioni logiche memorizzate nel database? So come selezionare le tabelle in un database, ciò che mi viene in mente di più è l'espressione di valutazione.

    
posta MTH 31.07.2018 - 23:07
fonte

3 risposte

1

Sembra che tu debba scrivere un parser mini per le espressioni logiche. Non è così difficile come sembra. Ci sono molti esempi in linea di tali parser. I parser di espressioni aritmetiche più semplici possono essere creati utilizzando lo shunt-yard. Credo che funzionerà anche per booleano.

Controlla questo.

link

    
risposta data 01.08.2018 - 01:14
fonte
1

Ho avuto lo stesso pensiero di Robert Harvey: perché non usare espressioni regolari? Quindi avresti una tabella di regex e i numeri di versione corrispondenti. L'esempio che date potrebbe certamente essere fatto come un'espressione regolare.

Le stringhe regex diventano le "condizioni logiche" per il prelievo dei numeri di versione. Ecco un codice di esempio. In questo esempio il dizionario "regexToVersion" è hardwired, ma nel codice di produzione questo sarebbe l'elenco di "condizioni logiche" che vengono letti da un database.

public class RegexTest
{
    private static Dictionary<string, string> regexToVersion =
        new Dictionary<string, string> {
                { "^.{4}LLP.[XY]", "v01.1.1"},
                { "^.{4}ABC.[XY]", "v01.1.2"},
            };
    public static void Test()
    {
        string[] tests = new[] { "abc", "1234LLP-Xaaaa", "1234LLP-Y", "1234LLP-Z",  };
        foreach (string test in tests)
        {
            Console.WriteLine($"Test {test}: {GetVersion(test)}");
        }
    }

    public static string GetVersion(string configCode)
    {
        foreach (var regex in regexToVersion)
        {
            if (Regex.IsMatch(configCode, regex.Key))
            {
                return regex.Value;
            }
        }
        return null;
    }
}

Output is:
Test abc:
Test 1234LLP-Xaaaa: v01.1.1
Test 1234LLP-Y: v01.1.1
Test 1234LLP-Z:
    
risposta data 03.08.2018 - 22:41
fonte
0

Questo sembra un buon lavoro per

link

Introduzione al castello

Se esplori la configurazione xml puoi definire classi in xml con le tue regole. Potresti fare l'intera meta-programmazione con la configurazione xml del castello. Cosa divertente potresti anche interagire con il sistema via console e creare classi, cambiare cose al volo. Sfortunatamente non posso condividere nessuno dei miei esempi di codice perché era sul posto di lavoro.

    
risposta data 01.08.2018 - 01:52
fonte

Leggi altre domande sui tag