Почему этот ArrayList дублирует строки? - PullRequest
0 голосов
/ 30 апреля 2020

Я младший разработчик и пытаюсь заполнить ArrayList из словаря. Моя проблема, скорее, чем добавление новой записи в ArrayList, она добавляет новую запись, но также перезаписывает значения для всех других значений в массиве.

Так что, если я проверяю значения при заполнении ArrayList, я смотрите значения из словаря, как и ожидалось. Но когда эта строка вставляется в ArrayList, все существующие строки перезаписываются данными из текущей строки словаря. Поэтому я получаю ArrayList с несколькими строками, которые являются дубликатами последней записи, добавленной из словаря. Мой код показан ниже. Может кто-нибудь сказать, пожалуйста, что я делаю не так? Код ниже

 ArrayList arrData = new ArrayList();
                eSummary edata = new eSummary();
                //Starts with the first 50 recods retrieved and adds them to the ArrayList.  Loops thru to get remaining records
                while (blnEmpty)
                {
                    if (response.IsSuccessStatusCode)
                    {
                        string json = response.Content.ReadAsStringAsync().Result;
                        var jss = new JavaScriptSerializer();
                        var dict = jss.Deserialize<Dictionary<string, dynamic>>(json);

                        for (int i = 0; i < dict.Values.Sum(x => x.Count); i++)
                        {
                            foreach (var item in dict)
                            {
                                string checkId = (dict["data"][i]["Id"]);

                                edata.Id = dict["data"][i]["Id"];
                                edata.idExternal = (dict["data"][i]["idExternal"]) == null ? "" : (dict["data"][i]["idExternal"]);
                                edata.Type = "Video";
                                edata.ownerId = (dict["data"][i]["uploadedByOwnerId"]);
                                edata.dateUploaded = Convert.ToDateTime((dict["data"][i]["dateUploaded"]));
                                edata.durationSeconds = Convert.ToDouble((dict["data"][i]["durationSeconds"]));
                                edata.category = (dict["data"][i]["categories"]).Count < 1 ? string.Empty : (dict["data"][i]["categories"][0]);
                                edata.title = (dict["data"][i]["title"]) == string.Empty ? string.Empty : (dict["data"][i]["title"]);
                                edata.dateRecordStarted = Convert.ToDateTime((dict["data"][i]["dateRecordStart"]));
                                edata.DateAPIRan = DateTime.Now;
                                if (CheckAutoTag(checkId, dict["data"][i]["tags"]))
                                {
                                    edata.AutoTagged = true;
                                }
                                else edata.AutoTagged = false;
                                arrData.Add(edata);

1 Ответ

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

edata является ссылочным типом. Вы продолжаете обновлять значения одного объекта в пределах l oop.

Вам необходимо вызвать new eSummary() и установить значения для нового объекта, а затем добавить , который , в ваш список.

Но обратите внимание, вы должны не использовать ArrayList в современном c#. Вместо этого используйте List<eSummary>.

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