C#: список заполнен тем же экземпляром класса, а не новым - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь прочитать файл из потока памяти и упорядочить его содержимое в списке экземпляров. Определенные строки в файле имеют определенные типы с соответствующими классами, и в файле может отображаться несколько строк одного типа.

Мой текущий код выглядит примерно так:

       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>();

Пример того, как выглядят эти классы:

    public class Class_01 : A_Record
    {
        public Class_01( Dictionary<string, A_AbstractClass> Params ) : base(Params)
        {
            RecordType = "01";
            RecordTitle = "Name of record";
        }

    }

A_Record abstract

    public abstract class A_Record
    {
       public virtual string RecordType { get; set; }
       public virtual string RecordTitle { get; set; }

        public int RecordLength { get; set; }

        public void WriteRule( string Vektis_Rule )
        {
            int writePosition = 0;

            foreach ( KeyValuePair<string, A_Element> Element in Elementen )
            {
                string ElementValue = Vektis_Rule.Substring( writePosition, Element.Value.Length );
                Element.Value.Write( ElementValue );

                writePosition += Element.Value.Length;
            }
        }

        public A_Record(Dictionary<string, A_Gegevenselement> Volgnummers)
        {
            Elementen = Volgnummers;
            RecordLength = 0;

            foreach (KeyValuePair<string, A_Gegevenselement> Element in Elementen)
            {
                var currentElement = Elementen[Element.Key];
                currentElement.StartingPosition = RecordLength;
                RecordLength += currentElement.Length;
            }
        }

    }

Таким образом, в основном, для каждой строки '04', которая появляется, я Я хочу добавить новый экземпляр Class_04 в список, а затем записать содержимое этой строки в экземпляр.

К сожалению, это не работает, как я надеялся. Если я добавлю несколько экземпляров Class_04 в список, все они будут иметь значение последней добавленной строки Class_04. Это, вероятно, означает, что все записи Class_04 в Списке являются одним и тем же экземпляром, и что я постоянно перезаписываю его вместо добавления нового экземпляра. Но я не понимаю, как это может быть, когда создается впечатление, что я каждый раз создаю новый экземпляр в то время как l oop.

Может ли кто-нибудь мне помочь? Как вы знаете, до недавнего времени я работал только с PHP, Python и Javascript. Так что у меня может быть просто d'oh момент здесь и я пропускаю что-то очень очевидное.

Заранее спасибо за ваше время и усилия!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

ListPosition, вы устанавливаете его в Count в начале l oop, поэтому ваш прирост перезаписывается или является излишним. Без кода для MessageStructure не могу сказать, но это выглядит неправильно.

Я бы вообще избавился от ListPosition и использовал бы вместо индексации [MessageStructure.Count] - 1 или еще лучше MessageStructure.Last().

Я подозреваю, что go будет немного неправильно конец файла, а также код после переключателя, который должен быть включен в if (reachedEndOfFile)

0 голосов
/ 15 апреля 2020

Я не могу сказать из кода здесь, но я подозреваю, что вы не создаете новый словарь для параметров каждого объекта записи. В классе A_Record у вас есть эта строка: Elementen = Volgnummers; Здесь хранится ссылка на словарь, который вы передали. Если вы повторно используете тот же экземпляр Dictionary с другим экземпляром A_Record, они оба будут иметь одинаковое содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...