2013-04-05 3 views
2

У меня есть список строк. Мне нужно иметь возможность фильтровать их аналогично запросу Google.Фильтрация списка строк с помощью логики?

Ex: NOT water OR (ice AND "fruit juice")

Значение возврата строки, которые не содержат слово воду или возвращать строки, которые могут иметь воду, если у них есть лед и «фруктовый сок».

Есть ли механизм в .NET, который может позволить пользователю писать запросы в этой форме (скажем, в текстовом поле) и задавать список или IEnumerable строки, возвращать те, которые содержат это.

Может ли LINQ что-то сделать?

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

+0

Я знаю, что могу сделать это с помощью LINQ, я больше заинтересован в анализе произвольной строки в исполняемом выражении. – jmasterx

+0

Я очень удивлен, что .NET не имеет ничего для синтаксического анализа. – jmasterx

ответ

3

Там нет ничего встраивается.

Вам нужно будет разобрать такой струны себя и, возможно, использовать Expression классы для создания исполняемого выражение, из которого необходимо отфильтровать.

1

Для этого запроса: Значение возвращаемых строк, которые не имеют слова «вода» или «обратные строки», которые могут иметь воду, если у них есть лед и «фруктовый сок».

попробовать что-то вроде этого, если вы собираетесь использовать LINQ

yourList.Where(i => !i.Contains("water") || 
       (i.Contains("water") && 
       i.Contains("ice") && 
       i.Contains("fruit juice"))); 
+0

Вы пропустили 'НЕ' в начале. И это не поможет с _any other input_ – Oded

+0

@Однако спасибо. –

0

В LINQ: list.Where(item => !item.Contains("water") || (item.Contains("ice") && item.Contains("fruit juice")))

+0

И когда пользователь вводит что-то еще? – Oded

+0

@Однако, я не понимал, что вопрос заключается в разборе запроса от пользователя. –

0

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

что я буду делать в таком случае, чтобы иметь предопределенные условия (сохраненные где-то), которые будут содержать все условия, необходимые вместе с их «кодирование переводов», как:

  • и
  • или
  • и не
  • и или
  • и т.д ...

и то, что вы будете делать во время выполнения, - это перевести эти условия/критерии в sql или linq или на любой язык, на который вам нужно передать его.

0

Вы можете попробовать использовать DataTable.Select метод:

public static class ExpressionExtensions { 

    public static IEnumerable<T> Select<T>(this IEnumerable<T> self, string expression) { 
    var table = new DataTable(); 
    table.Columns.Add("Value", typeof(T)); 

    foreach (var item in self) { 
     var row = table.NewRow(); 
     row["Value"] = item; 
     table.Rows.Add(item); 
    } 

    return table.Select(expression).Select(row => (T)row["Value"]); 
    } 

} 

Но вы должны следовать его формат, чтобы создать выражение:

var filtered = strings.Select("NOT Value LIKE '*water*' OR (Value LIKE '*ice*' AND Value LIKE '*fruit juice*')"); 

отметить также, что в этом случае, так как строки fruit juice уже содержит строку ice, второе условие является избыточным. Вам нужно будет найти способ выразить «слова», а не «подстроки».

В конце концов, вам может быть лучше реализовать логику синтаксического анализа самостоятельно.

Смежные вопросы