Список словаря хранит только последнюю строку - PullRequest
0 голосов
/ 25 октября 2018

У меня есть код ниже, который добавляет Dictionary данные к List IDictionary, как показано ниже

var datalist = new List<IDictionary<string, string>>();

var data = new Dictionary<string, string>();
for (var i = 0; i < dataTable.Rows.Count; ++i)
{
    foreach (var name in arrColumnNames)
    {
        data[name] = Convert.ToString(dataTable.Rows[i][name]);
    }

    datalist.Add(data);
}

Теперь проблема в том, что мои datalist продолжают обновлять последние значения data во всейСписок datalist.В чем дело?Как сохранить data значения в datalist?

Ответы [ 5 ]

0 голосов
/ 25 октября 2018
var datalist = new List<IDictionary<string, string>>();
for (var i = 0; i < dataTable.Rows.Count; ++i)
{
  var data = new Dictionary<string, string>();
    foreach (var name in arrColumnNames)
    { 
      data[name] = Convert.ToString(dataTable.Rows[i][name]);
    }
    datalist.Add(data);
}

Перемещено объявление словаря внутри цикла for, так что для каждой таблицы данных создается новый объект словаря и добавляются все столбцы.В противном случае Словарь сохраняет последние данные столбца

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

Вы создаете только один экземпляр Dictionary (вне цикла for) и добавляете один и тот же экземпляр для каждой строки в цикле.

В таком виде ваш список заканчиваетсябудучи списком ссылок на один и тот же словарь, и поскольку последняя строка в таблице имеет те же столбцы, что и все остальные строки, вы получите список словариков со значениями из последней строки.Но на самом деле это список, в котором каждая запись указывает на один и тот же словарь, который содержит только значения из последней строки, поскольку он перезаписал все предыдущие значения.

Если вы переместите строку, инициализирующую data внутри поля forцикл, в результате вы получите список (по одной записи для каждой строки) словарей, где ключ - это имя столбца, а значение - это значение для этого столбца для этой строки.

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

Вы должны переместиться

var data = new Dictionary<string, string>();

В

for (var i = 0; i < dataTable.Rows.Count; ++i)

До цикла foreach.

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

Я думаю, что вы можете сделать, чтобы получить мелкую копию словаря после добавления данных в список, попробуйте это

var datalist = new List<IDictionary<string, string>>();

var data = new Dictionary<string, string>();
for (var i = 0; i < dataTable.Rows.Count; ++i)
{
    foreach (var name in arrColumnNames)
    {
        data[name] = Convert.ToString(dataTable.Rows[i][name]);
    }

    datalist.Add(data);
    data = new Dictionary<string, string>(data);
}
0 голосов
/ 25 октября 2018

My Spidey Senses говорит мне, что вы новы для этого при каждом вызове метода. Короче говоря, проблема заключается в том, что вы создаете новый список каждый раз.Однако я могу быть совершенно не прав

Попробуйте это в своем классе и удалите его из метода

Поле класса

private List<IDictionary<string, string>> datalist = new List<IDictionary<string, string>>();

Тело метода

Предполагая, что ваш arrColumnNames является экземпляром списка строк

Вы можете сделать это с помощью Linq

 var dict = dataTable.Rows
                     .Cast<DataColumnCollection>()
                     .Select(row => arrColumnNames.ToDictionary(x => x, x => row[x].ToString()))
                     .ToList();

 datalist.AddRange(dict);

Сноска : я думаю, что это все немного подозрительно.Вы уверены, что хотите Dictionary в List, а не Dictionary из Key и List

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