昨天一个同学叫我帮编写一个符号三角形的c代码,今天就把它改写成用CodeDom生成的c#代码。
符号三角形:在一组字符串里(只有用空格分割的+或者-组成的字符串),在每次的相邻的两个符号比较,如果相同就在中间空格插入+,否则就插入-。一直运行到字符串里只有一个+或者-时停止,输出的字符串为符号三角形。
由于是CodeDom些列,所以先介绍几个CodeDom表达式:
1:CodeConditionStatement:判断语句即是if(condition){} else{},看最全的那个构造函数:
public CodeConditionStatement(
CodeExpression condition,//条件
CodeStatement[] trueStatements,//为true的语句体
CodeStatement[] falseStatements//为false语句体
)
2:CodeIterationStatement():表示 for 语句或语句块内的循环(使用测试表达式作为继续循环的条件):
在codedom中没有提高while和dowhile但是For已经够用的
public CodeIterationStatement(
CodeStatement initStatement,//for初始化
CodeExpression testExpression,//条件表达式
CodeStatement incrementStatement,//for变化体,增或减
CodeStatement[] statements//循环体
)
3:CodeBinaryOperatorExpression:表示一个表达式,该表达式包含在两个表达式间进行的二进制运算,
public CodeBinaryOperatorExpression(
CodeExpression left,//表达式左边
CodeBinaryOperatorType op,//操作符
CodeExpression right//表达式右边
)
4:CodeArrayIndexerExpression:表示对数组的索引的引用:
public CodeArrayIndexerExpression(
CodeExpression targetObject,//数组对象
CodeExpression[] indices//下标
)
其他参见CodeDOM 快速参考:msdn.microsoft.com/zh-cn/library/f1dfsbhc(VS.80).aspx
code:
4 5 6 7 8 9 10 11 12 | public CodeNamespace CreateNameSpace()
{
public CodeNamespace CreateNameSpace()
{
CodeMemberMethod test = new CodeMemberMethod();
test.Name = "Test" ;
test.Attributes = MemberAttributes.Public | MemberAttributes.Final;
test.Statements.Add( new CodeVariableDeclarationStatement( typeof ( char []), "ch" ,
|
4 | new CodeMethodInvokeExpression( new CodePrimitiveExpression( "+ - + - + + - -" ), "ToCharArray" ,
|
4 5 | new CodeExpression[] { })));
test.Statements.Add( new CodeMethodInvokeExpression( new CodeMethodReferenceExpression
|
4 | ( new CodeThisReferenceExpression(), "FuHaoSanJiao" ), new CodeExpression[] { new CodeVariableReferenceExpression( "ch" ),
|
4 5 6 7 8 9 | new CodePrimitiveExpression(0) }));
test.Statements.Add( new CodeMethodInvokeExpression( new CodeTypeReferenceExpression( "System.Console" ), "Read" ));
CodeMemberMethod fuHaoSanJiao = new CodeMemberMethod();
fuHaoSanJiao.Name = "FuHaoSanJiao" ;
fuHaoSanJiao.Parameters.Add( new CodeParameterDeclarationExpression( new CodeTypeReference( typeof ( char [])),
|
4 5 6 | "ch" ));
fuHaoSanJiao.Parameters.Add( new CodeParameterDeclarationExpression( new CodeTypeReference( typeof ( int )), "start" ));
fuHaoSanJiao.Statements.Add( new CodeMethodInvokeExpression( new CodeTypeReferenceExpression( "System.Console" ),
|
4 5 | "WriteLine" , new CodeExpression[] { new CodeObjectCreateExpression( typeof ( string ), new CodeArgumentReferenceExpression( "ch" )) }));
fuHaoSanJiao.Statements.Add( new CodeConditionStatement( new CodeBinaryOperatorExpression(
|
4 5 | new CodeArgumentReferenceExpression( "start" ), CodeBinaryOperatorType.GreaterThanOrEqual,
( new CodeBinaryOperatorExpression( new CodePropertyReferenceExpression(
|
4 5 6 7 | new CodeArgumentReferenceExpression( "ch" ), "Length" ),
CodeBinaryOperatorType.Divide , new CodePrimitiveExpression(2)))),
new CodeMethodReturnStatement()));
CodeBinaryOperatorExpression condition= new CodeBinaryOperatorExpression(
|
4 5 6 7 8 9 10 | new CodeVariableReferenceExpression( "i" ),
CodeBinaryOperatorType.LessThan,
new CodeBinaryOperatorExpression( new CodeBinaryOperatorExpression( new CodePropertyReferenceExpression( new CodeArgumentReferenceExpression( "ch" ), "Length" ),
CodeBinaryOperatorType.Subtract , new CodeArgumentReferenceExpression( "start" )), CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression(1)));
CodeConditionStatement iterationBody= new CodeConditionStatement( new CodeBinaryOperatorExpression(
new CodeArrayIndexerExpression( new CodeArgumentReferenceExpression( "ch" ),
|
4 5 | new CodeVariableReferenceExpression( "i" )),
CodeBinaryOperatorType.IdentityEquality, new CodeArrayIndexerExpression(
|
4 5 | new CodeArgumentReferenceExpression( "ch" ),
new CodeBinaryOperatorExpression( new CodeVariableReferenceExpression( "i" ),
|
4 5 6 | CodeBinaryOperatorType.Add, new CodePrimitiveExpression(2)))),
new CodeAssignStatement(
new CodeArrayIndexerExpression( new CodeArgumentReferenceExpression( "ch" ),
|
4 | new CodeBinaryOperatorExpression( new CodeVariableReferenceExpression( "i" ), CodeBinaryOperatorType.Add,
|
4 5 6 7 | new CodePrimitiveExpression(1))),
new CodePrimitiveExpression( '+' )));
iterationBody.FalseStatements.Add( new CodeAssignStatement(
new CodeArrayIndexerExpression( new CodeArgumentReferenceExpression( "ch" ),
|
4 | new CodeBinaryOperatorExpression( new CodeVariableReferenceExpression( "i" ), CodeBinaryOperatorType.Add,
|
4 5 6 | new CodePrimitiveExpression(1))),
new CodePrimitiveExpression( '-' )));
CodeAssignStatement iteerationbody2 = new CodeAssignStatement( new CodeArrayIndexerExpression(
|
4 5 6 | new CodeArgumentReferenceExpression( "ch" ), new CodeVariableReferenceExpression( "i" )),
new CodePrimitiveExpression( ' ' ));
fuHaoSanJiao.Statements.Add( new CodeIterationStatement( new CodeVariableDeclarationStatement( typeof ( int ),
|
4 5 | "i" , new CodeArgumentReferenceExpression( "start" )), condition,
new CodeAssignStatement( new CodeVariableReferenceExpression( "i" ), new CodeBinaryOperatorExpression(
|
4 5 6 7 8 | new CodeVariableReferenceExpression( "i" ), CodeBinaryOperatorType.Add,
new CodePrimitiveExpression(2))), new CodeStatement[] { iterationBody, iteerationbody2 }));
fuHaoSanJiao.Statements.Add( new CodeAssignStatement(
new CodeArrayIndexerExpression( new CodeArgumentReferenceExpression( "ch" ),
|
4 | new CodeBinaryOperatorExpression( new CodeBinaryOperatorExpression(
|
4 5 | new CodePropertyReferenceExpression( new CodeArgumentReferenceExpression( "ch" ), "Length" ),
CodeBinaryOperatorType.Subtract , new CodeArgumentReferenceExpression( "start" )),
|
4 5 6 7 | CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression(1))), new CodePrimitiveExpression( ' ' )));
fuHaoSanJiao.Statements.Add( new CodeMethodInvokeExpression( new CodeThisReferenceExpression(),
|
4 5 | "FuHaoSanJiao" , new CodeArgumentReferenceExpression( "ch" ) ,
new CodeBinaryOperatorExpression( new CodeArgumentReferenceExpression( "start" ),
|
4 5 6 7 8 9 10 11 12 13 14 15 16 17 | CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))));
CodeTypeDeclaration codeDomDemo2 = new CodeTypeDeclaration( "CodeDomDemo2" );
codeDomDemo2.Members.Add(test);
codeDomDemo2.Members.Add(fuHaoSanJiao);
codeDomDemo2.Attributes = MemberAttributes.Public;
codeDomDemo2.Comments.Add( new CodeCommentStatement( "this code is from CodeDom!" ));
CodeNamespace nspace = new CodeNamespace( "CodeDomDemo2" );
nspace.Imports.Add( new CodeNamespaceImport( "System" ));
nspace.Types.Add(codeDomDemo2);
return nspace;
}
}
}
|
输出代码为 :
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | namespace CodeDomDemo2
{
using System;
public class CodeDomDemo2
{
public void Test()
{
char [] ch = "+ - + - + + - -" .ToCharArray();
this .FuHaoSanJiao(ch, 0);
System.Console.Read();
}
private void FuHaoSanJiao( char [] ch, int start)
{
System.Console.WriteLine( new string (ch));
if ((start
>= (ch.Length / 2)))
{
return ;
}
for ( int i = start; (i
< ((ch.Length - start)
- 1)); i = (i + 2))
{
if ((ch[i] == ch[(i + 2)]))
{
ch[(i + 1)] = '+' ;
} else
{
ch[(i + 1)] = '-' ;
}
ch[i] = ' ' ;
}
ch[((ch.Length - start)
- 1)] = ' ' ;
this .FuHaoSanJiao(ch, (start + 1));
}
}
}
|
代码下载Demo1,Demo2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架