用逻辑过滤字符串列表?

时间:2013-04-05 12:31:44

标签: c# asp.net

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

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

意思是返回没有单词water的字符串或返回字符串如果有冰和“果汁”就可以有水。

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

LINQ可以做这样的事吗?

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

5 个答案:

答案 0 :(得分:3)

内置任何东西。

您需要自己解析这样一个字符串,并可能使用Expression类来构建一个可过滤的可执行表达式。

答案 1 :(得分:1)

对于此查询:含义返回没有单词water的字符串或返回字符串如果有冰和“果汁”则可以有水。

如果您要使用LINQ

,请尝试这样的操作
 yourList.Where(i => !i.Contains("water") || 
                (i.Contains("water") && 
                 i.Contains("ice") && 
                 i.Contains("fruit juice")));

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为我们无法使用代码示例回答您,因为您说这更合乎逻辑。

在这种情况下我会做的是预定义条件(保存在某处),其中包含您需要的所有条件以及它们的“编码翻译”,如:

  • 而不是
  • 和或
  • 等...

您将在运行时执行的操作是将这些条件/条件转换为sql或linq或您需要传递给它的任何语言。

答案 4 :(得分: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,因此第二个条件是多余的。你必须找到一种方法来表达“单词”而不是“子串”。

最后,您最好自己实现解析逻辑。