如何迭代字典字典列表?
问题描述:
我有以下代码。我有一个Oracle查询返回多行。我需要将数据填充到字典列表中,但是我遇到了一个问题,即该列表始终填满最后一行重复的行。如何迭代每个Oracle行的列表。如何迭代字典字典列表?
代码:
var list = new List<string>();
List<Dictionary<String, String>> listDic = new List<Dictionary<String, String>>();
using (var con = new OracleConnection(Config.EDLRDev))
{
var com = con.CreateCommand();
try
{
con.Open();
com.CommandText = "SELECT * FROM edlr_comm_rep_total a where a.dealer_id = 'wb-pos00289' and a.comm_type = 'Activation' ";
//com.Parameters.Add("msisdn", OracleDbType.Char).Value = msisdn;
Dictionary<String, String> objDic = new Dictionary<string, string>();
var reader = com.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
string CommissionDealerId = reader[0].ToString();
string Month = reader[1].ToString();
string DealerCommissionType = reader[2].ToString();
string CommissionCount = reader[3].ToString();
string CommissionAmount = reader[4].ToString();
objDic["CommissionDealerId"] = CommissionDealerId;
objDic["Month"] = Month;
objDic["DealerCommissionType"] = DealerCommissionType;
objDic["CommissionCount"] = CommissionCount;
objDic["CommissionAmount"] = CommissionAmount;
listDic.Add(objDic);
}
}
reader.Close();
}
catch (Exception ex)
{
con.Dispose();
}
con.Dispose();
return listDic;
}
答
您正在使用相同的词典objDic
,它在while循环之外被实例化。您只是在循环中每次传递字典的值。在你的列表中,你正在添加对同一个objDic字典的引用,这就是为什么你有重复。您需要在while循环中的每个过程中创建一个新字典。
try
{
con.Open();
com.CommandText = "SELECT * FROM edlr_comm_rep_total a where a.dealer_id = 'wb-pos00289' and a.comm_type = 'Activation' ";
//com.Parameters.Add("msisdn", OracleDbType.Char).Value = msisdn;
var reader = com.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Dictionary<String, String> objDic = new Dictionary<string, string>();
string CommissionDealerId = reader[0].ToString();
string Month = reader[1].ToString();
string DealerCommissionType = reader[2].ToString();
string CommissionCount = reader[3].ToString();
string CommissionAmount = reader[4].ToString();
objDic["CommissionDealerId"] = CommissionDealerId;
objDic["Month"] = Month;
objDic["DealerCommissionType"] = DealerCommissionType;
objDic["CommissionCount"] = CommissionCount;
objDic["CommissionAmount"] = CommissionAmount;
listDic.Add(objDic);
}
}
reader.Close();
}
答
需要初始化objDic
内环路:
var reader = com.ExecuteReader();
if (reader.HasRows) {
while (reader.Read()) {
Dictionary<String, String> objDic = new Dictionary<string, string>(); // MOVED!
string CommissionDealerId = reader[0].ToString();
string Month = reader[1].ToString();
string DealerCommissionType = reader[2].ToString();
string CommissionCount = reader[3].ToString();
string CommissionAmount = reader[4].ToString();
objDic["CommissionDealerId"] = CommissionDealerId;
objDic["Month"] = Month;
objDic["DealerCommissionType"] = DealerCommissionType;
objDic["CommissionCount"] = CommissionCount;
objDic["CommissionAmount"] = CommissionAmount;
listDic.Add(objDic);
}
}
否则你只是改变了相同的实例一遍。
很好,非常感谢:) – Sereen