之前写过一篇 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