第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Sprache 中的文本查詢解析

Sprache 中的文本查詢解析

C#
人到中年有點(diǎn)甜 2022-07-23 08:56:02
我正在嘗試編寫一些代碼來(lái)匹配基于模式的字符串:模式:“狗和(貓或山羊)”測(cè)試字符串:“doggoat” 結(jié)果:true測(cè)試字符串:“dogfrog” 結(jié)果:假我正在嘗試使用 Sprache 編寫解析器,其中大部分邏輯由 Corey對(duì)類似問(wèn)題的出色回答提供。我快到了,但是運(yùn)行代碼時(shí)出現(xiàn)異常:System.Func'沒(méi)有為類型2[System.String,System.Boolean]' 和 ''System.Func`2[System.String,System.Boolean]'定義二元運(yùn)算符 AndAlso 。我知道這意味著我需要將表達(dá)式樹(shù)節(jié)點(diǎn)處的 lambda 表達(dá)式與邏輯運(yùn)算符結(jié)合起來(lái),我根據(jù)此處另一個(gè)問(wèn)題的答案嘗試使用 ExpressionVisitor 。但是,程序在執(zhí)行 ExpressionVisitor 之前崩潰 - 似乎首先執(zhí)行 Parse 命令,但我不太明白為什么(可能是因?yàn)?Sprache.Parse.Select 語(yǔ)句不強(qiáng)制執(zhí)行 lambda?) ,或者如何強(qiáng)制它先被執(zhí)行。示例代碼如下(為了簡(jiǎn)潔起見(jiàn),我刪除了所有運(yùn)算符,但“和”除外,從Corey 的模板中重新引入它們是微不足道的。必須從 NuGet 添加 Sprache 才能編譯代碼。class Program{    static void Main(string[] args)    {        var patternString = "dog and cat";        var strTest = "dog cat";        var strTest2 = "dog frog";        var conditionTest = ConditionParser.ParseCondition(patternString);        var fnTest = conditionTest.Compile();        bool res1 = fnTest(strTest); //true        bool res2 = fnTest(strTest2); //false    }}public static class ConditionParser{    static ParameterExpression Param = Expression.Parameter(typeof(string), "_");    public static Expression<Func<string, bool>> ParseCondition(string text)    {        return Lambda.Parse(text);    }    private static Parser<Expression<Func<string, bool>>> Lambda    {        get        {            var reduced = AndTerm.End().Select(delegate (Expression body)            {                var replacer = new ParameterReplacer(Param);                return Expression.Lambda<Func<string, bool>>((BinaryExpression)replacer.Visit(body), Param);            });            return reduced;        }    }    static Parser<Expression> AndTerm =>        Parse.ChainOperator(OpAnd, StringMatch, Expression.MakeBinary);    // Other operators (or, not etc.) can be chained here, between AndTerm and StringMatch    static Parser<ExpressionType> OpAnd = MakeOperator("and", ExpressionType.AndAlso);    private static Parser<Expression> StringMatch =>        Parse.Letter.AtLeastOnce()        .Text().Token()        .Select(value => StringContains(value));
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊

您的代碼存在幾個(gè)問(wèn)題,但導(dǎo)致異常的主要問(wèn)題是StringContains返回 lambda 表達(dá)式的方法。并且Expression.AndAlso(以及大多數(shù)Expression方法)基于簡(jiǎn)單的非 lambda 表達(dá)式(或 lambda 表達(dá)式主體)。解析代碼的整個(gè)想法是識(shí)別和組合簡(jiǎn)單的表達(dá)式,并從結(jié)果表達(dá)式中生成單個(gè) lambda 表達(dá)式。

要解決原始問(wèn)題,該StringContains方法應(yīng)直接返回MethodCall表達(dá)式而不是 lambda 表達(dá)式。

同一StringContains方法中的第二個(gè)問(wèn)題是將參數(shù)反轉(zhuǎn)為string.Contains. 它基本上是這樣做token.Contains(parameter)的,而根據(jù)預(yù)期結(jié)果它應(yīng)該做相反的事情。

整個(gè)方法(使用另一個(gè)方便的Expression.Call重載)可以簡(jiǎn)化為

static Expression StringContains(string subString) =>
    Expression.Call(Param, "Contains", Type.EmptyTypes, Expression.Constant(subString));

現(xiàn)在一切都應(yīng)該按預(yù)期工作。

但是,由于ConditionParser該類使用單個(gè)ParameterExpression實(shí)例,然后用于構(gòu)建 lambda 表達(dá)式,因此不需要ParameterReplacer,因此Lambda方法(屬性)可以簡(jiǎn)化為

private static Parser<Expression<Func<string, bool>>> Lambda =>
    AndTerm.End().Select(body => Expression.Lambda<Func<string, bool>>(body, Param));


查看完整回答
反對(duì) 回復(fù) 2022-07-23
  • 1 回答
  • 0 關(guān)注
  • 115 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)