如何将搜索字符串转换为布尔条件
本文关键字:布尔 条件 转换 字符串 搜索 | 更新日期: 2023-09-27 18:12:53
我有一个存储在字符串中的搜索条件:
string Searchstr = "(r.Value.Contains("PwC") || (r.Value.Contains("Canadian") && r.Value.Contains("thrive"))) || (r.Value.Contains("Banana") && r.Value.Contains("Gayle"))"
我想在If语句中使用这个来检查值:
if(searchstr)
{
then do this....
}
但是if应该有一个boolean类型的searchstr
如何将其转换为布尔值?
编辑:要求是在以下格式的文本框中动态地给出搜索条件-"PwC OR (Canadian AND thrive)"。它将用于搜索XML文件。
因此,我已经加载了一个XML文件,并希望在LINQ中有一个Where条件,我需要使用动态LINQ,但其中不允许字符串,而且我还有一些花括号要处理。
想到我已经从XML(我需要搜索的标签值)中获取了结果集
var selectedBook = from r in document.Root.Descendants("Archives").Elements("Headline").Elements("Para")
select r;
,理想情况下想尝试如下:
var query=selectedbook.Where(searchstr)
或
if(searchstr){....then do this}
您需要做一些工作来实现这一点,但这是可能的。
你应该看看动态LINQ库。这允许您将LINQ条件(和其他子句)指定为字符串,并像LINQ操作符一样执行它们。
从ScottGu的博客上的解释开始,然后点击链接:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
我假设字符串将只引用一组特定的对象(例如,在本例中是r
或r.Value
—或者任何您想要的对象,只要您事先知道它)。如果是这种情况,则:
- 创建以对象(可能被引用的对象)为参数的
delegate
并根据需要返回bool
。 以编程的方式在内存中编写一个小的c#源文件来定义查询作为符合上面指定的委托的方法体(最好有固定的名称)。使用 - 从主程序中运行动态编写和编译的代码。
CSharpCodeProvider
类编译程序集使用您的自定义函数返回您想要的bool
。你可能会猜到这不是一个直截了当的问题但同时它也没有看起来那么难
你可以执行几个步骤来得到你想要的:
-
获取搜索表达式作为输入(例如:"PwC OR (Canadian AND thrive)")
-
在
XElement
上编写一个返回true并将搜索条件作为输入的扩展方法。然后您就可以使用var selectedBook = from r in document.Root.Descendants("Archives").Elements("Headline").Elements("Para") where r.SatisfiesCriteria(searchCriteria) select r;
-
编写一个解析器类,解析
searchCritera
并以解析后的格式存储。(例如,您可以将其转换为后缀符号)。这很简单,你可以使用标准算法。对于您的目的OR, AND将是操作符,PwC等将是操作数。 - 现在只需在扩展方法中调用这个解析器,然后计算得到的后缀表达式。这同样可以通过标准的基于堆栈的求值来完成。事实上,如果您只解析一次条件,然后只在where中求值会更好。在求值时,需要将操作数替换为
r.Value.Contains
http://scriptcs.net/