Динамическая оценка условий строки в C # - PullRequest
6 голосов
/ 06 июля 2010

У меня есть коллекция строк. Мне нужно найти из этой коллекции строки, которые удовлетворяют некоторому условию, например, эта строка содержит A и B или C. Эти критерии задаются пользователем, поэтому они являются динамическими. В Linq это должно быть что-то вроде

List<String> items = new List<string> { "sdsdsd", "sdsd", "abc"};

var query = from item in items
            where  item.Contains("a") && item.Contains("b") || item.Contains("c")                         
            select item;

Я хочу сделать условие where динамическим, чтобы оно могло работать для любого ввода пользователем. Возможно ли сделать это в C # без использования какой-либо внешней библиотеки. Может быть, используя Linq или что-то еще, встроенное в .Net Framework.

Спасибо, Gary

Ответы [ 3 ]

5 голосов
/ 06 июля 2010

Хотя вы не хотите использовать внешние библиотеки, есть одна, которая просто фантастическая, и это PredicateBuilder . Конструктор предикатов позволяет создавать набор предикатов для сопоставления элементов, например ::

var predicate = PredicateBuilder.True<string>();
predicate = predicate
    .And(p => p.Contains("a"))
    .And(p => p.Contains("b"));

var matches = items.Where(predicate);
1 голос
/ 06 июля 2010

Если вы хотите сделать это самостоятельно, начните здесь: Динамические предикаты: http://msdn.microsoft.com/en-us/library/bb513731.aspx Деревья динамических выражений: http://msdn.microsoft.com/en-us/library/bb882637.aspx

Я думаю, что это больше, чем вы хотели, и сильнопредлагаем использовать некоторую (облегченную) готовую и протестированную библиотеку, которая выполняет преобразование из пользовательских строк в запросы времени выполнения.

1 голос
/ 06 июля 2010

альтернативный текст http://www.scottgu.com/blogposts/dynquery/step2.png

Вам нужно что-то подобное?Используйте динамическую библиотеку запросов Linq (загрузка включает примеры).

Ознакомьтесь с блогом ScottGu , чтобы получить больше примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...