字典列表仅保留最后一行
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
,而不是Dictionary
和Key
的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);
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
循环之前。
以上是关于字典列表仅保留最后一行的主要内容,如果未能解决你的问题,请参考以下文章