2

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

前任:NOT water OR (ice AND "fruit juice")

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

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

LINQ 可以做这样的事情吗?

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

4

5 回答 5

3

没有内置任何东西。

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

于 2013-04-05T12:34:27.580 回答
1

对于这个查询:意思是返回没有单词 water 的字符串,或者如果有冰和“果汁”,则返回可以有水的字符串。

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

 yourList.Where(i => !i.Contains("water") || 
                (i.Contains("water") && 
                 i.Contains("ice") && 
                 i.Contains("fruit juice")));
于 2013-04-05T12:34:30.723 回答
0

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

于 2013-04-05T12:35:23.403 回答
0

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

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

  • 或者
  • 并不是
  • 和或
  • ETC...

您在运行时要做的就是将这些条件/标准翻译成 sql 或 linq 或您需要将其传递给的任何语言。

于 2013-04-05T12:38:45.627 回答
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*')");

另请注意,在这种情况下,由于 stringfruit juice已经包含 string ice,因此第二个条件是多余的。您必须找到一种表达“单词”而不是“子字符串”的方法。

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

于 2013-04-06T22:51:00.233 回答