1

我有一个存储在字符串中的搜索条件:

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 应该有一个 searchstr 作为布尔值。

如何将其转换为布尔值?

编辑:要求是在文本框中以以下格式动态提供搜索条件 - “普华永道 OR(加拿大和蓬勃发展)”。这将用于搜索 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}
4

4 回答 4

1

您需要做一些工作才能做到这一点,但这是可能的。

你应该看看动态 LINQ 库。这允许您将 LINQ 条件(和其他子句)指定为字符串并像 LINQ 运算符一样执行它们。

从 ScottGu 博客上的解释开始,然后点击链接: http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-库.aspx

于 2013-05-09T08:29:42.243 回答
0

我假设该字符串将仅引用一组特定的对象(r或者r.Value在这种情况下,例如 - 或您想要的任何其他内容,只要您事先知道它)。如果是这种情况,那么:

  1. 创建 a delegate,将对象(可能被引用)作为参数并bool根据需要返回 a 。
  2. 以编程方式在内存中编写一个小的 C# 源文件,该文件将查询定义为符合上述委托的方法的主体(最好使用固定名称)。
  3. 使用CSharpCodeProvider该类来编译带有返回bool您想要的自定义函数的程序集。
  4. 从主程序运行动态编写和编译的代码。
于 2013-05-09T11:45:02.423 回答
0

好吧,您可能会猜到它不会是直截了当的,但同时它并不像看起来那么难

您可以执行几个步骤来获得所需的内容:

  1. 获取搜索表达式作为输入(例如“PwC OR(加拿大 AND 繁荣)”)

  2. 编写一个XElement返回 true 并将搜索条件作为输入的扩展方法。然后您就可以使用

    var selectedBook = from r in 
    document.Root.Descendants("Archives").Elements("Headline").Elements("Para")
    where r.SatisfiesCriteria(searchCriteria)
    select r;
    
  3. 编写一个解析器类,将searchCritera其解析并以解析后的格式存储。(例如,您可以将其转换为后缀符号)。这很容易,您可以为此使用标准算法。出于您的目的,OR,AND 将是运算符,而 PwC 等将是操作数。括号将作为解析的一部分被删除。

  4. 现在只需在你的扩展方法中调用这个解析器,然后评估你得到的后缀表达式。这同样可以通过基于标准堆栈的评估来完成。事实上,如果你解析一次标准然后只在哪里评估会更好。在评估时,您需要将操作数替换为r.Value.Contains
于 2013-05-09T12:32:37.160 回答
0

对于http://scriptcs.net/来说,这似乎是一个很好的场景

于 2013-05-10T10:24:21.540 回答