首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -无法根据文本文件数据在列表中添加元素(这是一个列表)

C# -无法根据文本文件数据在列表中添加元素(这是一个列表)
EN

Stack Overflow用户
提问于 2018-10-17 09:55:53
回答 2查看 54关注 0票数 0

我正在研究C# winForm应用程序。在我的项目中,我需要读取文本文件。把数据列在清单上。

用于测试:使用"listTest“列表

用于cmd :使用"listCmd“列表

我的要求是:我需要Test1和Test2 in mainList i,e "listTest“。在Test1 -> cmd1,cmd2,cmd3 (在listCmd中)。在cmd1 -> tx,rx.Test2也一样。

文本文件数据

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中,主列表被声明。

代码语言:javascript
复制
 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;
 } 

我无法找出我错过了什么。请帮我解决这个问题。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-17 10:44:56

实际上,您可以重构代码,使其更加结构化,从而减少潜在的bug并提高可测试性。为了解决您当前的问题,只需替换如下代码;

代码语言:javascript
复制
// ...
// ...
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
        // ...
        // ...
票数 0
EN

Stack Overflow用户

发布于 2018-10-17 10:45:25

读取cmd时,始终将其分配给testnum。

代码语言:javascript
复制
testnum.listCmd.Add(listcmd);

但是,当您阅读" test“行时,您不会创建一个新的testnum,因此所有cmds都被分配到相同的测试中。

我认为测试行的部分应该如下所示:

代码语言:javascript
复制
            if (line.Contains("Test"))
            {
                splitLine = line.Split(':');
                txRx = splitLine.Skip(1).ToArray();   
                testnum = new cls_test();
                uc.listTest.Add(testnum); 
            }

我不知道为什么本节会更改txRx。

一般来说,这是相当混乱的代码。我认为您应该将splitLine、rxTx和listCmd移到循环中,以表明它们的值不会从一行传递到下一行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52852059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档