我正在研究C# winForm应用程序。在我的项目中,我需要读取文本文件。把数据列在清单上。
用于测试:使用"listTest“列表
用于cmd :使用"listCmd“列表
我的要求是:我需要Test1和Test2 in mainList i,e "listTest“。在Test1 -> cmd1,cmd2,cmd3 (在listCmd中)。在cmd1 -> tx,rx.Test2也一样。
文本文件数据
Test:Test1
cmd-1:5A 02 11 00 02 3A 05 ||5A 02 01 02 3A 3F
cmd-2:5A 02 31 00 02 3E 00 80||5A 02 01 02 3E 43
cmd-3:5A 02 21 00 02 00||5A 02 01 02 0B 10
Test:Test2
cmd-1:5A 02 11 00 02 3A 05 00 14 00 42||5A 02 01 02 3A 3F
cmd-2:5A 02 31 00 02 3E 00 00 02 00 80||5A 02 01 02 3E 43 我的问题是:我尝试了下面的代码,在这方面,我获得了Test1的所有5cmd值。Test2也是如此。我只想要Test1中的3cmd和Test2中的2cmd。。
在班级-1:
private void readCmd()
{
string cmdfile = System.IO.Directory.GetCurrentDirectory() + "\\Cmd.txt";
try
{
string[] lines = File.ReadAllLines(cmdfile);
string[] splitLine;
string[] txRx;
cls_test testnum = new cls_test();
str_listcmd listcmd = new str_listcmd();
foreach (string line in lines)
{
if (line.Contains("Test"))
{
splitLine = line.Split(':');
txRx = splitLine.Skip(1).ToArray();
uc.listTest.Add(testnum);
}
if (line.Contains("cmd"))
{
string[] delimiter = { ":", "||" };
txRx = line.Split(delimiter, StringSplitOptions.None);
listcmd.cmdNo = txRx[0];
listcmd.txCmd = txRx[1];
listcmd.rxCmd = txRx[2];
testnum.listCmd.Add(listcmd);
}
}
for (int j = 0; j < uc.listTest.Count; j++)
{
for (int i = 0; i < uc.listTest[j].listCmd.Count; i++)
{
string tx = uc.listTest[j].listCmd[i].txCmd;
string rx = uc.listTest[j].listCmd[i].rxCmd;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}在类-2中,主列表被声明。
public List<cls_test> listTest = new List<cls_test>(); //main list
struct str_listcmd
{
public string cmdNo { get; set; }
public string txCmd { get; set; }
public string rxCmd { get; set; }
}
class cls_test
{
public List<str_listcmd> listCmd = new List<str_listcmd>();
}
private void button1_Click(object sender, EventArgs e)
{
var a = listTest;
} 我无法找出我错过了什么。请帮我解决这个问题。提前谢谢。
发布于 2018-10-17 10:44:56
实际上,您可以重构代码,使其更加结构化,从而减少潜在的bug并提高可测试性。为了解决您当前的问题,只需替换如下代码;
// ...
// ...
cls_test testnum = null; // <= Leave as NULL at the beginning
str_listcmd listcmd = new str_listcmd();
foreach (string line in lines)
{
if (line.Contains("Test"))
{
testnum = new cls_test(); // <= Init object for each Test line
// ...
// ...发布于 2018-10-17 10:45:25
读取cmd时,始终将其分配给testnum。
testnum.listCmd.Add(listcmd);但是,当您阅读" test“行时,您不会创建一个新的testnum,因此所有cmds都被分配到相同的测试中。
我认为测试行的部分应该如下所示:
if (line.Contains("Test"))
{
splitLine = line.Split(':');
txRx = splitLine.Skip(1).ToArray();
testnum = new cls_test();
uc.listTest.Add(testnum);
}我不知道为什么本节会更改txRx。
一般来说,这是相当混乱的代码。我认为您应该将splitLine、rxTx和listCmd移到循环中,以表明它们的值不会从一行传递到下一行。
https://stackoverflow.com/questions/52852059
复制相似问题