字典列表仅保留最后一行

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

我有下面的代码,它将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值?

c# .net list dictionary
5个回答
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,而不是DictionaryKeyList


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

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


-1
投票

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

按照目前的情况,您的列表最终将成为对同一个字典的引用列表,并且由于表中的最后一行与所有其他行具有相同的列,因此您最终看起来像所有字典列表使用最后一行的值。但实际上它是一个列表,其中每个条目指向同一个字典,它只包含最后一行的值,因为它覆盖了所有以前的值。

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


-2
投票

你必须搬家

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

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

foreach循环之前。

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