词典列表仅保留最后一行

时间:2018-10-25 04:48:16

标签: c# .net list dictionary

我有下面的代码将Dictionary数据添加到IDictionary的List中,如下所示

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 :(得分:1)

我的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,而不要使用DictionaryKey

中的List

答案 1 :(得分:0)

我认为您可以做的是在将数据添加到列表后获得字典的浅表副本,请尝试

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

答案 2 :(得分:0)

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循环中移动了Dictionary声明,以便它在每个数据表中创建字典的新对象并添加所有Columns。否则,词典将保留最后一个数据列的详细信息

答案 3 :(得分:-1)

您仅创建一个Dictionary的单个实例(在for循环之外),并为循环中的每一行添加相同的实例。

按现状显示,您的列表最终将是对同一词典的引用的列表,并且由于表中的最后一行与所有其他行的列相同,因此最终得到的是列表全部包含最后一行中的值。但实际上,这是一个列表,每个条目都指向同一词典,该词典仅包含最后一行的值,因为它已覆盖所有先前的值。

如果将初始化data的行移动到for循环中,则将得到一个字典列表(每行一个条目),该字典的键为列名,值为该值该行的列。

答案 4 :(得分:-2)

你必须移动

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

进入

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

foreach循环之前。