字典列表仅保留最后一行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典列表仅保留最后一行相关的知识,希望对你有一定的参考价值。

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

答案

我的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

另一答案

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

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);
}
另一答案
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保留最后一个数据列详细信息

另一答案

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

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

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

另一答案

你必须搬家

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

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

foreach循环之前。

以上是关于字典列表仅保留最后一行的主要内容,如果未能解决你的问题,请参考以下文章

从列表视图中删除一行后刷新片段

“不要保留活动” - 当应用程序恢复时,片段仅可见一秒钟

仅保留审计表中每个对象的最后 5 行

13 个非常有用的 Python 代码片段

如何从具有字典列表的表中查询,仅针对某些键 (BigQuery) SQL

Python代码阅读(第26篇):将列表映射成字典