|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
||||||
Конструктор фильтра03.04.2018, 12:30. Показов 6416. Ответов 37
Метки нет (Все метки)
Добрый день!
Хочу сделать что-то вроде универсального метода - конструктора фильтра. В качестве входных параметров предполагается: 1. List<string> PropNames - коллекция имен свойств. Есть свойства, которые присущи нескольким классам. Сами свойства есть экземпляры классов-справочников, которые наследуются от базового класса
3. List<SomeEntity> InList - коллекция, предполагаемая к фильтрованию. Выходные параметры: 1. List<SomeEntity> OutList - отфильтрованная коллекция. Не знаю с какой стороны подступиться к решению. Готов выслушать любые предложения/идеи.
0
|
||||||
| 03.04.2018, 12:30 | |
|
Ответы с готовыми решениями:
37
Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор
Какой метод синтеза фильтра обеспечивает наименьшее число параметров фильтра при заданных ограничениях АЧХ? |
|
|
|
| 03.04.2018, 12:38 | |
|
wrq2017, тут вам помогут деревья выражений (Expression Trees) и класс Expression + Linq для фильтрации коллекции: строите Expression, компилируете в предикат и скармливаете его в тот же Enumerable.Where().
1
|
|
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
| 03.04.2018, 12:39 [ТС] | |
|
Cupko, примером не поможете?
0
|
|
|
.NET C#,ASP.NET MVC
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
|
||||||||||||||||||||||||||
| 03.04.2018, 13:52 | ||||||||||||||||||||||||||
Сообщение было отмечено wrq2017 как решение
Решение
1. Читаем все про Expression и System.Linq.Expressions
2. Планируем модель вводных данных, которая должна содержать в себе свойство "PropertyName" с названием свойства по которому будет фильтрация, "Value" - значение\значения с которым сранивать, и перечесление "Operation", которое будет содрежать в себе список возможных операция над выражениями (Equal,Greater,Lower итд) 3. Начинаем строить с определения ParameterExpression
4. Информация для размышления: для получения списка всех возможных операций - читайте про Expression выражения можно комбинировать через Expression.And (exp1, exp2) или Expression.Or(exp1, exp2) - сооствественно будет строиться нужная логическая цепочка. Expression.Call - позволяет использовать методы в выражениях через MethodInfo, который можно получить с помощью рефлексии (типо Contains, Any итд)
3
|
||||||||||||||||||||||||||
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
||||||
| 03.04.2018, 14:09 [ТС] | ||||||
|
lvlkoo, огромное спасибо! примерно так уже и начал делать.
У меня какая-то проблема со вставкой в предикат выражения. Делаю так:
Что я делаю не так?
0
|
||||||
|
|
|
| 03.04.2018, 14:13 | |
|
wrq2017, Expression нужно скомпилить для начала, я предполагаю.
1
|
|
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
||||||
| 04.04.2018, 10:03 [ТС] | ||||||
|
Cupko, ааааа.... Вон оно чё.... Спасибо!!!!
Добавлено через 19 часов 47 минут lvlkoo, позвольте добить тему до конца. В общем всё понятно, а на конкретном примере не работает. Для примера, хочу отфильтровать коллекцию экземпляров класса Party, у которого есть поле Contract. И я хочу найти все Party, у которых Contract.Id = 5. Делаю так:
0
|
||||||
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|||||||||||||||||
| 04.04.2018, 10:37 [ТС] | |||||||||||||||||
|
Eсли делать проще, без рефлексии и использования метода Contains, в этом случае получаем ошибку: Двоичный оператор Equal не определен для типов "Sales.Data_model.Contract" и "System.Int32"."
Cupko, делаю как написано тут.
Добавлено через 1 минуту
0
|
|||||||||||||||||
|
|
|
| 04.04.2018, 11:00 | |
|
wrq2017,
Мне кажется, ExpressionTree для вашего случая это лютый over engineering. Зачем так усложнять? Объясните более подробно что должен делать ваш метод. Откуда берутся выражения для фильтрации, что в них будет, зачем все это нужно?
1
|
|
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
| 04.04.2018, 11:47 [ТС] | |
|
Storm23, не знаю лютый или не лютый
Подход мне нравится, надо только разобраться.Есть несколько коллекций классов, которые предполагается фильтровать. У каждого такого класса есть свойства, типы свойств - либо другие классы (вроде словарей), либо DateTime. Выражения для фильтрации по сути два: 1. проверить содержится ли Id какого-либо свойства в массиве (коллекции) допустимых. 2. Если тип свойства DateTime, то оно должно входить в допустимый диапазон дат. В настоящий момент для каждого фильтруемого класса написан отдельный метод, в котором вручную последовательно определены свойства и передача в качестве параметра коллекции допустимых значений. Всё бы хорошо, но сейчас достаточно неудобно отслеживать - все ли свойства учтены в том или ином методе, неудобно добавлять метод к новому классу (нарушает принцип DRY?). Хотелось бы сделать этот процесс универсальнее и проще. Добавлено через 1 минуту Storm23, есть альтернативные предложения?
0
|
|
|
|
|||||||||||||||||||||||
| 04.04.2018, 13:36 | |||||||||||||||||||||||
|
Если же выражения для фильтрации заранее известны - ExpressionTree это лишнее переусложнение.
Далее этот метод можно использовать следующим образом. Например, если нам нужно отфильтровать все объекты, у которых свойство MyEntity имеет ID 2 или 3, то пишем следующее:
Кликните здесь для просмотра всего текста
2
|
|||||||||||||||||||||||
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
||||||
| 04.04.2018, 15:27 [ТС] | ||||||
|
Storm23, спасибо за Ваш комментарий! С точки зрения, того, что этот путь проще, чем с Expression Trees, спору нет.
А как можно доработать Ваш код, с учетом следующих пожеланий: 1. В качестве параметра метода передавать только коллекцию имен свойств и коллекцию коллекций допустимых ID (List<List<int>>); 2. Убрать лямбда-выражение (e => allowedIDs.Contains(e.ID)) внутрь метода. (все фильтруемые свойства являются наследниками базового класса со свойствами string Description и int Id). Добавлено через 4 минуты Т.е. я хочу написать что-то вроде
0
|
||||||
|
|
|||||||
| 04.04.2018, 15:46 | |||||||
Сообщение было отмечено wrq2017 как решение
Решение
2
|
|||||||
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
| 05.04.2018, 10:12 [ТС] | |
|
Storm23, вопрос по последнему сообщению. Вызов метода Where получается рекурсивный? Тогда не соответствуют аргументы метода.
Добавлено через 27 секунд У Вас этот код ошибок не выдаёт?
0
|
|
|
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
|||||||
| 05.04.2018, 11:07 | |||||||
|
Полный будет такой:
2
|
|||||||
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
||||||||||||||||
| 05.04.2018, 14:38 [ТС] | ||||||||||||||||
|
Fleder, понятно, спасибо!
Добавлено через 3 часа 29 минут Fleder, Storm23, уважаемые коллеги, огромное спасибо за Вашу помощь и, собственно, всем высказавшимся по теме!!! Боюсь показаться назойливым, но всё-таки есть еще вопрос. Допустим модель данных выглядит так:
Иначе говоря, я предполагал, что второй метод (как изначально поставленный вопрос) будет работать вот так:
0
|
||||||||||||||||
|
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
|||||||
| 05.04.2018, 18:22 | |||||||
1
|
|||||||
|
|
|||||||
| 05.04.2018, 18:43 | |||||||
|
Вам причины понятны, а мне - нет. Вероятно вы имеете ввиду что в обоих примерах должен отбираться первый объект? Тогда вот код. Он работает и для первого примера и для второго: Кликните здесь для просмотра всего текста
1
|
|||||||
| 05.04.2018, 18:43 | |
|
Помогаю со студенческими работами здесь
20
Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования Конструктор класса, конструктор копирования запускается не тот который нужен this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|