2013-04-05 93 views
2

我有一个字符串列表。我需要能够以类似Google查询的方式来过滤它们。用逻辑过滤字符串列表?

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

含义没有字水或返回,可以有水,如果他们有冰和“果汁”的字符串返回字符串。

.NET中是否有一种机制可以允许用户以这种形式(例如在文本框中)编写查询,并给出一个List或IEnumerable字符串,并返回包含这个的字符串。

LINQ可以做这样的事情吗?

我知道我可以用LINQ做到这一点,我更关心的是将任意字符串解析为可执行表达式。

+0

我知道我可以用LINQ来做到这一点,我更关心的是将任意字符串解析为可执行表达式。 – jmasterx 2013-04-05 12:36:46

+0

我很惊讶.NET没有任何标记解析。 – jmasterx 2013-04-05 12:43:28

回答

3

没有什么内置的。

你需要自己解析这样一个字符串,并可能使用Expression类建立从中筛选可执行的表达。

1

对于此查询:含义返回字符串,如果他们有冰块和“果汁”,则返回的字符串不包含水或返回可以有水的字符串。

尝试这样的事情,如果你要使用LINQ

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

你在开始时错过了'NOT'。这对任何其他input_ – Oded 2013-04-05 12:35:02

+0

@Oded都没有帮助,谢谢。 – 2013-04-05 12:39:29

0

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

+0

而当用户输入其他东西? – Oded 2013-04-05 12:37:17

+0

@Oded是的,我没有意识到问题是关于解析来自用户的查询。 – 2013-04-05 12:38:11

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,第二个条件是多余的。你必须找到表达“单词”而不是“子串”的方法。

最后,你可能会更好地自己实现解析逻辑。