Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有Linq ish功能的c#StringBuilder如果还有其他可能的话?_C#_Stringbuilder_Class Extensions - Fatal编程技术网

具有Linq ish功能的c#StringBuilder如果还有其他可能的话?

具有Linq ish功能的c#StringBuilder如果还有其他可能的话?,c#,stringbuilder,class-extensions,C#,Stringbuilder,Class Extensions,我写下的AST(抽象语法树)不是树的形式,而是为了正确格式化我的代码。。类似于自定义语言的叮当声,我正在使用StringBuilder实现效果。。。 现在我要做的事情有: public string Visit(IfStatement ifStatement, int indent = 0) { var sb = new StringBuilder() .Append('\t', indent)

我写下的AST(抽象语法树)不是树的形式,而是为了正确格式化我的代码。。类似于自定义语言的叮当声,我正在使用StringBuilder实现效果。。。 现在我要做的事情有:

        public string Visit(IfStatement ifStatement, int indent = 0)
        {
            var sb = new StringBuilder()
                .Append('\t', indent)
                .Append(Token.IfKeyword.ToString())
                .AppendBetween(ifStatement.Test.Accept(this), "(", ")").AppendLine()
                .Append(ifStatement.Consequent.Accept(this, indent + 1));

            if (ifStatement.Consequent != null)
            {
                sb.AppendLine()
                    .Append('\t', indent)
                    .AppendLine(Token.ElseKeyword.ToString())
                    .Append(ifStatement.Consequent.Accept(this, indent + 1));
            }

            return sb.ToString();
        }
这有时会变得相当复杂,所以我希望我能做一些类似的事情:

sb.Append("Hello").IfElse(a > 5, sb => sb.Append("world!"), sb => sb.AppendLine("ME!!")).Append(...)
这可以通过类扩展来实现吗? 非常感谢您抽出时间


(顺便说一句,有没有更好的方法来写AST?我目前正在使用访问者模式来实现效果,但如果你知道更好的方法,请告诉我……如果达到一定的行宽,我还想引入文本换行……但我不知道如何做)。

我最终遵循了@GSerg的建议

公共静态StringBuilder IfElse(此StringBuilder sb,布尔条件,如果为真则执行操作,如果为假则执行操作)
{ 
if(条件){if_true(sb)}else{if_false(sb)}返回sb;
}
然后我可以做:

new StringBuilder().Append(“World”).IfElse(!IsNight(),sb=>sb.Insert(0,“你好”。AppendFormat(,我的名字是{0}”,GetName()),sb=>sb.Insert(0,“再见”))

我只是不知道lambda是如何工作的(我需要使用函数作为参数)。

sb.Append(“Hello”).Append(a>5?“world!”:“ME!!\n”).Append(…)
?@GSerg可能应该使用
环境.NewLine
而不是
\n
。在我的示例中,我使用AppendBetween来添加开始和结束文本(如果它还不存在)。例如,
sb.AppendBetween(“Hello”、“(“,”)”)
return“”(Hello)”和
sb.AppendBetween(“Hello)”,“(“,”)
也返回“(Hello)”,附录行只是给出了一个较小的示例。如果我想做一些类似于
sb.Append(“Hello”).IfElse(a>5,sb=>sb.Append(“world!”),sb=>sb.AppendBetween(“ME!!”)).Append(…)
?@juharr是的,但在使用stringbuilder的上下文中,这将是一种奇怪的字符串连接,在这一点上,我宁愿实现一个实际的
IfElse
扩展方法。这非常简单,因为它是
公共静态StringBuilder IfElse(此StringBuilder sb,bool条件,Action if_true,Action if_false){if(condition){if_true();}else{if_false();}返回sb;}
。或者,
公共静态StringBuilder IfElse(此StringBuilder sb,bool条件,Action if_true,Action if_false){if(condition){if_true(sb);}else{if_false(sb);}返回sb;}
,如果想法是传递
sb=>sb.Append()
而不是
()=>sb.Append()