Я не могу найти указатель в правильном направлении, я даже не уверен, что это за термины, которые я должен исследовать, но бесчисленные часы работы в Google, кажется, крутят меня по кругу , поэтому, надеюсь, может помочь коллективный улей интеллекта Stack Overflow.Нужно руководствоваться ориентировочным логическим деревом логики
Проблема в этом, мне нужен способ фильтрации данных в том, что я могу назвать только составным логическим деревом. В настоящее время система реализует простую систему фильтрации И. Например, скажем, у нас есть набор данных людей. Вы добавляете множество фильтров, которые показывают всех людей, где (Пол = Женский) И (Возраст> 23) И (Возраст < 30) И (Статус = Одиночный). Достаточно легко, итерация по каждому элементу, добавление в действительную коллекцию предметов, только если каждое условие истинно.
Проблема, с которой я сталкиваюсь, заключается в том, как я могу обрабатывать пользователя, способного создавать сложные запросы, и есть и/или? Я думаю о чем-то вроде дерева, где каждый узел представляет и выражение оценивает его дочерние объекты на true или false. Простейшим примером будет: - отфильтровать до ((Пол == Мужской И Возраст == 25) ИЛИ (Пол == Женский И Статус == Одиночный)) И IQ> 120. Извините, я не могу придумать лучшего примера на момент. Но как вы собираетесь представлять этот тип дерева выражений и оценивать элементы в коллекции против этих фильтров. Какие ссылки помогут? Черт, каков какой-то проклятый поиск Google, который может привести к положительному направлению ?!
Спасибо всем, кто может оказать любую помощь.
Вот пример составного запроса в виде дерева с использованием набора данных людей
- запросов - Покажите мне все человек, где секс является мужчиной и глаз зеленые или пол является женщиной, голубые глаза, или статус один. В форме Paren (Пол == Мужской & & Глаза == Зеленый) || (Пол == Женский & & (Eyes == Синий || Статус == Single))
Так в форме дерева им Думая
o-Root Node
- And - Sex = Male
- And - Eyes = Blue
- Or - Sex = Female
- And Eyes = Blue
- Or Status = Single
Я считаю, что решение будет представлять каждый узел такого в структура данных, как
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
}
Таким образом, для данного узла, оценить chilren, если вы являетесь и узел, а затем возвращает истину, если ваши результаты выражения в верно, и все ваши и дети оценивают истина или любой ИЛИ ребенок оценивает значение true и рекурсирует.
Кажется, чтобы удовлетворить все концептуальные условия, которые я могу бросить на него, но с тех пор мы его реализуем. Я опубликую реальный код позже, когда его работа и фотографии помогут лучше описать эту проблему для других.
Предлагаю вам разъяснить, в какой форме ваши данные: SQL db? Я предполагаю, что тег «as3» относится к ActionScript 3: если это так, вы действительно ищете специальные методы C# или AS3 или просто для «теории»? – BillW
Данные хранятся в памяти, хотя технически реализация выполняется как в режиме flash, так и в silverlight, меня гораздо больше интересует понимание общего решения, чем конкретная реализация. Суть проблемы заключается в представлении пользовательского интерфейса пользователю, который позволяет им динамически создавать сложный запрос для фильтрации набора данных. Мне нужна надежная структура данных для представления запроса. До сих пор я следующий за узлом - Тип - А или А - поле - поле набора данных этот узел таргетирования - Работа - =, =,>, < <=, > = - Value - значение применить операцию против – JTtheGeek
Более четкое объяснение! Я предлагаю вам уточнить, находится ли структура данных в C#/SilverLight: если это так, я бы предположил, что вы будете использовать Linq для выполнения «тяжелого подъема». Если вы уже на высоком уровне с Linq, используя lambdas, анонимные методы и т. Д., Это одно: если вы этого не сделаете, вы можете получить хороший совет по SO (если вы его попросите) в ресурсах изучения Linq (imho Jon Skeet «C# in Depth» - лучшая книга C# на планете с превосходным охватом Linq). Это может быть несовместимо с вашей идеей, но вы можете использовать словарь с «независимо» в качестве ключей и исполняемых (анонимных) методов в качестве значений. - BillW – BillW