C# LINQ布尔表达式

C# LINQ布尔表达式,c#,.net,vb.net,linq,lambda,C#,.net,Vb.net,Linq,Lambda,我不知道这个问题是否适合这里。假设我有一个带值的字符串: A=“ab1,eb4,gr3,…” 然后还有两个字符串B包含必须具有的值和C不允许的值。不幸的是,B和C可以在字符串中包含逻辑and/OR e、 g B=“(ut2 | eg1)和ab1” C=“ke2和pa5” 现在我正在寻找一种方法来检查a对B和C是否有效。正确还是错误 例如,将字符串转换为单独包含值的字符串列表并在该列表上启用LINQ表达式非常容易 但我如何才能最好地“解析”B和C中的信息,以使用列表A上的LINQ表达式对其求值呢

我不知道这个问题是否适合这里。假设我有一个带值的字符串:

A=“ab1,eb4,gr3,…”

然后还有两个字符串B包含必须具有的值C不允许的值。不幸的是,B和C可以在字符串中包含逻辑and/OR

e、 g

B=“(ut2 | eg1)和ab1”

C=“ke2和pa5”

现在我正在寻找一种方法来检查a对B和C是否有效。正确还是错误

例如,将字符串转换为单独包含值的字符串列表并在该列表上启用LINQ表达式非常容易

但我如何才能最好地“解析”B和C中的信息,以使用列表A上的LINQ表达式对其求值呢

我认为理想的解决方案是将B和C分别作为一个逻辑表达式,直接检查它们上的列表A。但如何开始呢

感谢您的支持和问候。

有效的方法是:

1) 检查B和C中的所有值是否存在于A中,并将其替换为“真”或“假”。线索来自:

B=“(ut2 | eg1)和ab1”

B=“(假|假)&真”

2) 计算这个字符串

对于评估,我发现了以下方法:

这可能不是很好,但它很有效。有没有一种方法可以使用LINQ表达式或二进制表达式计算存储在字符串中的逻辑表达式?我在过去的两个小时里试过了,但都没能成功

    Dim exp As Expression(Of Func(Of String, Boolean)) = Function(p) p = "True Or False"
    Dim o As Object
    o = Expression.Lambda(exp).Compile().DynamicInvoke()

StackOverflow不是一个代码编写服务,但有些代码编写起来很有趣

下面是一个类,该类将测试短语解析为
表达式
树,然后编译该树以返回
Func
以测试
哈希集

然后,您可以将测试值转换为
哈希集

然后您可以编译测试:

var fB = PhraseCompiler.Compile(B);
var fC = PhraseCompiler.Compile(C);
var testBresult = fB(As);
var testCresult = fC(As);
并运行以下测试:

var fB = PhraseCompiler.Compile(B);
var fC = PhraseCompiler.Compile(C);
var testBresult = fB(As);
var testCresult = fC(As);

注意:编译器不会进行错误检查,并且可能会对错误的测试短语引发异常。

听起来您正在寻找类似于OData进行过滤的方式。请允许我补充一点,它必须最终成为一个软件解决方案,除了VB.net或C代码,但无法导入Library。因此,我正在寻找一种具有框架功能的方法。我不确定您为什么希望通过LINQ实现这一点。您可能应该只考虑创建自己的函数来评估这一点,这不是一个小问题;您必须以某种方式解析逻辑表达式。当然可能,但并不简单。如果你正在寻找神奇的linq one衬里,你就不走运了,这是不会发生的。B和C有多复杂?另外,是否有Not操作员?正如有人指出的,这不是小事。首先让我说一声非常感谢!我从中学到了很多。但我认为它实际上没有正确评估。例如,A=“ab1,eb4,gr3”和B=“(ut2 | eb4)&ab1”这样B应该返回True,因为(False或True)和True,对吗?也。。。var As=A.Split(“,”).ToHashSet();它应该是:var As=A.Split(',').ToHashSet();因为split只需要一个字符,对吗?好的,这是因为.split方法。更改为“”,并将中的所有“”替换为“”,最终得到正确的结果。@fox根据您的输入,它应该可以工作-可能您的原始字符串与您在问题中的字符串不完全相同?很抱歉,答复太晚。刚刚发现错误。他站在我这边。非常好用,非常感谢!通过多次阅读您的代码,您学到了很多!要回答您的问题,请仅使用Roslyn脚本。但是,有一个简单的表达式计算器可以用作技巧:
newdatatable().Compute(“true或false”,null)
返回
true
var fB = PhraseCompiler.Compile(B);
var fC = PhraseCompiler.Compile(C);
var testBresult = fB(As);
var testCresult = fC(As);