C#:列表填充了相同的类实例,而不是新的实例

问题描述 投票:0回答:1

我正在尝试从内存流中读取文件并将其内容组织在实例列表中。文件中的某些行具有带有相应类的某些类型,并且同一类型的多行可以出现在文件中。

我当前的代码如下:

       public void initializeStructure( System.IO.MemoryStream RawFile )
       { 
            int positioninFile = 0;
            while (!reachedEndOfFile)
            {
                string recordType = GetRecordType(RawFile, positioninFile);
                int ListPosition = MessageStructure.Count;

                switch (recordType)
                {
                    case "01":
                        Class_01 _01 = new Class_01(Params);
                        MessageStructure.Add(_01);
                        break;
                    case "02":
                        Class_02 _02 = new Class_02(Params);
                        MessageStructure.Add(_02);
                        break;
                    case "04":
                        Class_04 _04 = new Class_04(Params);
                        MessageStructure.Add(_04);
                        break;
                    default:
                        reachedEndOfFile = true;
                        break;
                }

                string row = GetRowFromMemoryStream(RawFile, 572, positioninFile);
                MessageStructure[ListPosition].WriteRule(row);

                ListPosition++;
                positioninFile += 572;
            }
       }

消息结构定义:

public List<A_Record> MessageStructure = new List<A_Record>();

因此,基本上,对于出现的每个'04'行,我都希望将一个新的Class_04实例添加到列表中,然后将该行的内容写入该实例。

遗憾的是,这没有按我希望的那样工作。如果我将Class_04的多个实例添加到列表中,则它们都具有添加的最后Class_04行的值。这可能意味着列表中的所有Class_04条目都是同一实例,并且我一直在覆盖它,而不是添加新实例。但是我不知道怎么回事,就像每次在While循环中创建一个新实例一样。

有人可以帮我吗?众所周知,直到最近我才使用PHP,Python和Javascript。因此,我可能在这里只是一个[[d'oh时刻,而错过了一些非常明显的事情。

提前感谢您的时间和精力!
c# list class instance
1个回答
0
投票
ListPosition,您需要在循环开始时将其设置为Count,这样您的增量将被覆盖或多余。没有MessageStructure的代码,无法分辨,但看起来不正确。

我将完全摆脱ListPosition,并使用[MessageStructure.Count] - 1或更好的MessageStructure.Last()代替索引。

我怀疑在文件末尾也会出现一些错误,因为切换后的代码将执行,并且应该包装在if (reachedEndOfFile)中>

© www.soinside.com 2019 - 2024. All rights reserved.