我有一个字符串列表。我需要能够以与Google查询类似的方式过滤它们。
例如:NOT water OR (ice AND "fruit juice")
意思是返回没有单词water的字符串或返回字符串如果有冰和“果汁”就可以有水。
.NET中是否有一种机制可以允许用户以这种形式(例如在文本框中)编写查询并给出List或IEnumerable字符串,返回包含该形式的查询。
LINQ可以做这样的事吗?
我知道我可以用LINQ做到这一点,我更关心将任意字符串解析为可执行表达式。
答案 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
,因此第二个条件是多余的。你必须找到一种方法来表达“单词”而不是“子串”。
最后,您最好自己实现解析逻辑。