我有下面的代码将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
值?
答案 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
,而不要使用Dictionary
和Key
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
循环之前。