Parece que no puedo encontrar un puntero en la dirección correcta, ni siquiera estoy seguro de cuáles son los términos que debería investigar, pero las innumerables horas de búsqueda en Google me parecen girar en círculos , así que con suerte la colmena colectiva de inteligencia de Stack Overflow puede ayudar.Necesito orientación hacia el árbol de lógica booleana evaluativa
El problema es este, necesito una forma de filtrar datos en lo que solo puedo llamar un árbol de lógica compuesta. Actualmente, el sistema implementa un sistema de filtrado AND simple. Por ejemplo, digamos que tenemos un conjunto de datos de personas. Se agrega un montón de filtros tales que muestran todas las personas que (Sexo = Mujer) Y (edad> 23) y (Edad < 30) y (estado = Individual). Lo suficientemente fácil, iterar a través de cada elemento, agregar a una colección de elementos válida solo si todas las condiciones son verdaderas.
El problema que estoy enfrentando es ¿cómo puedo manejar que el usuario pueda crear consultas complejas involucradas en y's and or's? Estoy pensando en algo así como un árbol en el que cada nodo representa y la expresión evalúa sus hijos en verdadero o falso. Un ejemplo sería simplista - filtre a ((sexo masculino y la edad == == 25) o (Sexo Femenino == == y el estado individual)) y el CI> 120. Lo siento, no puedo pensar en un mejor ejemplo a el momento. Pero, ¿cómo harías para representar este tipo de árbol de expresiones y evaluar los elementos de una colección con estos filtros? ¿Cuáles son algunas referencias que podrían ayudar? Demonios, ¿qué maldita búsqueda de Google podría llevar a una dirección positiva?
Gracias a cualquier persona que pueda proporcionar cualquier ayuda.
Aquí es un ejemplo de una consulta compuesto en forma de árbol utilizando un conjunto de datos de las personas
- consultas - Muéstrame todas las personas donde el sexo es hombre y los ojos son de color verde o el sexo es femenino, los ojos son de color azul, o el estado es único. En forma Paren (Sex == Male & & Eyes == verde) || (Sexo Femenino == & & (Ojos Azul == == || Estado Individual))
lo tanto en forma de árbol im Pensando
o-Root Node
- And - Sex = Male
- And - Eyes = Blue
- Or - Sex = Female
- And Eyes = Blue
- Or Status = Single
creo que la solución es representar cada nodo en tales una estructura de datos como
Node
{
OpType - AND or OR
ExpressionField - The field to evaluate
ExpressionOp - =, !=, >, >=, <, <=
ExpressionValue - the value to compare the field's value against
Function Evaluate() - returns a bool
}
Así que para un nodo dado, evaluar los chilren, si usted es un nodo y, a continuación, devolver verdadero si la expresión da como resultado cierto y todos sus hijos y como resultado true o cualquier O el niño evalúa verdadero y recurrente.
Parece que satisface todas las condiciones conceptuales que puedo ofrecer, pero lo haremos desde que lo implemente. Voy a publicar el código real más tarde cuando esté funcionando e imágenes para ayudar a describir este problema mejor para los demás.
sugerimos que aclarar qué forma los datos están en: db SQL? Supongo que la etiqueta "as3" se refiere a ActionScript 3: si es así, ¿realmente está buscando técnicas específicas de C# o AS3, o simplemente para "teoría"? – BillW
Los datos están en la memoria, aunque técnicamente la implementación está tanto en flash como en Silverlight, estoy mucho más interesado en comprender la solución general que en una implementación específica. El quid de la cuestión consiste en presentar una interfaz de usuario para el usuario que les permite construir dinámicamente una consulta compleja para filtrar el conjunto de datos. Necesito una estructura de datos sólida para representar la consulta. Hasta ahora tengo el siguiente para un nodo - Tipo - Y u O - campo - el campo del conjunto de datos de este nodo se dirige - Funcionamiento -! =, =,>, < <=, > = - Valor - el valor para aplicar la operación contra – JTtheGeek
¡Explicación más clara! Sugiero que aclare si la estructura de datos está en C#/SilverLight: si es así, supongo que usará Linq para hacer el "trabajo pesado". Si ya está en un nivel alto con LINQ, utilizando lambdas, métodos anónimos, etc., eso es una cosa: si no está, se puede obtener un buen consejo sobre SO (si se solicita) sobre los recursos de estudio Linq (en mi humilde opinión Jon "C# in Depth" de Skeet es el mejor libro de C# en el planeta con una excelente cobertura de Linq). Esto puede ser irrelevante para su idea, pero puede usar un diccionario con "lo que sea" como claves y métodos ejecutables (anónimos) como Valores. - billw – BillW