Ich kann keinen Anhaltspunkt in die richtige Richtung finden, ich bin nicht einmal sicher, was die Begriffe sind, die ich erforschen sollte, aber unzählige Stunden des Googelns scheinen mich im Kreis zu drehen, also hoffentlich der kollektive Bienenstock von Intelligenz von Stack Overflow kann helfen.
Das Problem ist, ich brauche eine Möglichkeit, Daten zu filtern, die ich nur als zusammengesetzten Logikbaum bezeichnen kann. Derzeit implementiert das System ein einfaches UND-Filtersystem. Nehmen wir zum Beispiel an, wir haben einen Datensatz von Menschen. Sie fügen eine Reihe von Filtern hinzu, so dass alle Personen angezeigt werden, wo (Geschlecht = weiblich) UND (Alter & gt; 23) UND (Alter & lt; 30) UND (Status = Einzel). Einfach genug, durchlaufen Sie jedes Element, fügen Sie nur dann einer Sammlung gültiger Elemente hinzu, wenn alle Bedingungen erfüllt sind.
Das Problem, auf das ich stoße, ist, wie ich mit dem Benutzer umgehen kann, der in der Lage ist, komplexe Abfragen zu erstellen, die involviert sind und oder und? Ich denke an etwas wie einen Baum, wo jeder Knoten repräsentiert und Ausdruck seiner Kinder wahr oder falsch auswertet. Ein einfaches Beispiel wäre - filter down zu ((Sex == männlich und Alter == 25) oder (Sex == weiblich und Status == Single)) und IQ & gt; 120. Tut mir leid, ich kann mir im Moment kein besseres Beispiel vorstellen. Aber wie würden Sie diese Art von Ausdrucksbaum darstellen und die Elemente in einer Sammlung anhand dieser Filter auswerten? Was sind einige Hinweise, die helfen würden? Hölle, was sind einige verdammte Google-Suche, die in eine positive Richtung führen könnten?!
Danke an alle, die Ihnen helfen können.
Hier ist ein Beispiel für eine zusammengesetzte Abfrage in Baumform mit einem Datensatz von Personen
Also in Baumform im Denken
%Vor%Ich glaube, die Lösung besteht darin, jeden Knoten in einer Datenstruktur wie
darzustellen %Vor%Bewerten Sie also für einen gegebenen Knoten die chilren, wenn Sie ein AND-Knoten sind, und geben Sie true zurück, wenn Ihr Ausdruck true ergibt und alle Ihre UND-Kinder als true ausgewertet werden oder ein ODER-Kind als true und recurse up ausgewertet wird.
Scheint, jede begriffliche Bedingung zu erfüllen, die ich darauf werfen kann, aber wir werden, seit ich es einmal umgesetzt habe. Ich werde den richtigen Code später veröffentlichen, wenn es funktioniert und Bilder helfen, dieses Problem besser für andere zu beschreiben.
Dein Parsing des Ausdrucks ((Sex == männlich UND Alter == 25) ODER (Sex == weiblich und Status == Single)) UND IQ & gt; 120 sieht seltsam aus. Ich würde es als:
analysieren %Vor%Der Baumtyp wäre:
%Vor% Diese Art von Abfragen werden oft als OR
ed-Array von AND
ed-Klauseln dargestellt. Das heißt, ein Tabellenformat, in dem Sie über mehrere Bedingungen AND
ed lesen und dann bis OR
sie lesen. Dies führt zu einigen Wiederholungen von Bedingungen, ist aber für Benutzer leicht zu lesen, zu schreiben und zu verstehen. Ihr Beispiel ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120
würde wie
Sie sollten Google nach Begriffen wie "Prädikatenkalkül" und "konjunktive Normalform" suchen.
Ich muss sagen, dass dies der Grund ist, warum Datenbank-Engines gebaut werden. Sie können alles tun, was Sie mit der Set-Logik benötigen, und Sie können sogar zu dem Ergebnis kommen, das Sie suchen, aber das sind Standardprobleme, die von Datenbanken und SQL gelöst werden. Sie können sich linq auch für eine In-Code-Lösung ansehen.
Klingt so, als müssten Sie eine Benutzeroberfläche erstellen, die die Erstellung eines einfachen Syntaxbaums ermöglicht. Wenn Sie GO drücken, können Sie den Baum begehen und einen LINQ-Ausdrucksbaum aus dieser Benutzeroberflächenstruktur erstellen. Führen Sie die LINQ-Abfrage aus, und verarbeiten Sie die Ergebnisse nach Bedarf. Ich würde Ihnen daher empfehlen, LINQ-Ausdrucksbäume zu lesen.