C # - Невозможно добавить элементы (список) в список в соответствии с данными текстового файла - PullRequest
0 голосов
/ 17 октября 2018

Я работаю над приложением C # winForm.В моем проекте мне нужно прочитать текстовый файл.и получить данные в списке.

Для теста: используется список "listTest"

Для команды cmd: используется список "listCmd"

Мое требование: мне нужны Test1 и Test2в 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  

Моя проблема: я попробовал следующий код, в котором я получаю все значения 5 cmd для Test1.И то же самое для Test2.Я хочу только 3 cmd в Test1 и 2 cmd в Test2..

В классе 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;
 } 

Я не могу найти то, что мне не хватает.Пожалуйста, помогите мне решить эту проблему.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

когда вы читаете 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 внутри цикла, чтобы указать, что их значения не переносятся с одной строки на следующую.

0 голосов
/ 17 октября 2018

Фактически вы можете реорганизовать свой код, чтобы сделать его более структурированным, что уменьшает потенциальные ошибки и повышает тестируемость.Чтобы решить вашу текущую проблему, просто замените код следующим образом:

// ...
// ...
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
        // ...
        // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...