之前写过一篇 C#自动生成用于填写青铜器的“工作日报”。由于后来重装了几次系统,每次重新编译都要拉界面,感觉很不方便 :-(好吧这和我比较懒也有关系,所以这回加强了一下程序的功能。重写后的程序,生成条目的数量和生成条目的内容都放到了XML配置文件里。方便编译,缺点是控制台没有TopMost属性,每轮“复制+粘贴”后都要把控制台呼唤出来。
配置文件LogConfig.xml,要求与本程序的可执行文件在同一个目录下:
<?xml version="1.0" encoding="utf-8" ?> <Root LogNeed="4"> <Log Text="维护监控客户端,优化代码" /> <Log Text="与研发中心协调解决监控客户端的内存泄漏问题" /> <Log Text="学习C++编程" /> <Log Text="熟悉linux环境" /> <Log Text="修复程序BUG,发布版本" /> <Log Text="搭建环境,测试程序运行" /> <Log Text="对程序进行新一轮的自测,优化代码" /> <Log Text="阅读项目文档,学习项目相关知识" /> <Log Text="研究监控数据脚本,熟悉Linux上的Oracle数据库相关知识" /> <Log Text="修订详细设计文档" /> <Log Text="维护监控系统,为NEEQ提供技术支持" /> <Log Text="探讨新需求的实现,评估新需求的可行性" /> <Log Text="制定了新需求的实现时间表" /> <Log Text="程序编码" /> <Log Text="程序新功能实现,发布新版本" /> <Log Text="参加业务相关的集中培训" /> <Log Text="总结程序运行环境,完善程序相关文档" /> <Log Text="为程序部署提供技术支持" /> <Log Text="完善监控客户端使用手册" /> </Root>
程序代码:
Imports System.Xml Module MainModule Sub Main() '读取XML文档中的内容 Dim xmlDoc = New XmlDocument xmlDoc.Load("LogConfig.xml") Dim xmlRoot As XmlNode = xmlDoc.SelectSingleNode("Root") '统计一共需要随机选出多少项 Dim iLogNeed As Integer = DirectCast(xmlRoot,XmlElement).GetAttribute("LogNeed") '统计有多少个XmlElement Dim counter As Integer = 0 For Each xmlObj In xmlRoot.ChildNodes If xmlObj.GetType().ToString() = "System.Xml.XmlElement" Then counter = counter + 1 End If Next '生成数组 Dim sGoingText() As String = New String(counter - 1) {} counter = 0 For Each xmlObj In xmlRoot.ChildNodes If xmlObj.GetType().ToString() = "System.Xml.XmlElement" Then sGoingText(counter) = DirectCast(xmlObj,XmlElement).GetAttribute("Text") counter = counter + 1 End If Next 'For Each x In sGoingText ' Console.WriteLine(x) 'Next '如果要选出的条目数大于总共的条目数,则报警并退出 If iLogNeed > sGoingText.Length Then Console.WriteLine("配置错误:条目数不够") PrintAChar() Environment.Exit(exitCode:=1) End If '循环生成日志条目 While True Try '生成一组日志信息 Generate(iLogNeed,sGoingText) PrintAChar() Catch ex As Exception Console.WriteLine(ex.Message) End Try End While End Sub ''' <summary> ''' 生成n个不重复的有序随机数,并将s中的内容按生成的随机数打印出来 ''' </summary> ''' <param name="n">生成条目数</param> ''' <param name="s">源条目内容</param> ''' <remarks></remarks> Private Sub Generate(n As Integer,s() As String) '随机生成4个不重复的数字由小到大排列 Dim rd As Random = New Random(DateTime.Now.Millisecond) Dim rdnum(n - 1) As Integer '生成数组,下标从0到n-1 For i As Integer = 0 To n - 1 '生成不重复的四个随机数 rdnum(i) = rd.Next(s.Length) Dim bNeedRdAgain As Boolean = False Do bNeedRdAgain = False For j As Integer = 0 To i - 1 If rdnum(j) = rdnum(i) Then '随机数重复则重新生成一个随机数,重新判定 bNeedRdAgain = True rdnum(i) = rd.Next(s.Length) Exit For End If Next Loop Until Not bNeedRdAgain Next Dim a = 1 '为生成的n个随机数排序 Array.Sort(rdnum) Dim sb As Text.StringBuilder = New Text.StringBuilder For i As Integer = 1 To n sb.Append(i.ToString + "." + s(rdnum(i - 1)) + vbCrLf) Next Console.WriteLine(sb.ToString) '复制生成的内容到剪贴板 '需要手动添加引用 System.Windows.Forms System.Windows.Forms.Clipboard.Clear() System.Windows.Forms.Clipboard.SetText(sb.ToString()) '复制到剪贴板() Console.WriteLine("内容已被复制到剪贴板") End Sub ''' <summary> ''' 实现按任意键继续 ''' </summary> ''' <remarks></remarks> Private Sub PrintAChar() Console.Write("按任意键继续") Console.ReadKey() Console.WriteLine(vbBack + vbCrLf) End Sub End Module
程序运行效果:
END