我们有一个表格,它返回以下行:
ID (integer) PRICE (decimal)
106 5.2
106 6.7
107 9.2
107 8.3
107 3.2
我需要将此表中的值转换为以下内容:
106, (5.2, 6.7)
107, (9.2, 8.3, 3.2)
在这种情况下,这是Dictionary<int, List<decimal>>
,但它不一定是字典。如有必要,我可以改变它。
ID的数量和相应的价格不固定(因此我们可以在此列表中包含108个,并且可以有一个或多个价格)。
以下是我所做的:
var retVal = new Dictionary<int, List<decimal>>();
var dbRow = new List<decimal>();
var itemsPerRow = new List<List<decimal>>();
...
//loop the table
using (var dr = cmd.ExecuteReader())
{
while (dr.Read())
{
dbRow.Add(int.Parse(dr["ID"].ToString()));
dbRow.Add(decimal.Parse(dr["PRICE"].ToString()));
itemsPerRow.Add(dbRow);
}
}
//get the distinct ID's
var gb = itemsPerRow.GroupBy(x => x[0]).Select(x => x.Key);
foreach (var row in gb)
{
if (!retVal.ContainsKey((int) row))
{
IEnumerable<decimal> ratesForRow = itemsPerRow.Where(x => x.Contains(row)).Select(x => x[1]);
retVal.Add((int) row, ratesForRow.ToList());
}
}
这有效,但似乎不是很直接,我不满意的是我循环数据库结果,创建一个列表,然后再次循环列表,我的列表被声明为包含小数但ID列是int,所以我不得不把它强制转换为int。这样可以,还是有其他方法可以做到这一点?
由于
答案 0 :(得分:1)
我们来看看。首先,您只需一个列表:
var tempResults = Enumerable.Empty<KeyValuePair<int, decimal>>().ToList();
using (var dr = cmd.ExecuteReader())
while (dr.Read())
tempResults.Add(new KeyValuePair<int, decimal>
{ Key = int.Parse(dr["ID"].ToString()),
Value = decimal.Parse(dr["PRICE"].ToString()) });
然后,处理相当简单。
return tempResults.GroupBy(k => k.Key).ToDictionary(g => g.Key, g => g.ToList());
答案 1 :(得分:1)
你可以直接在一个循环中完成:
Dictionary<int, List<Decimal>> result = new Dictionary<int, List<Decimal>>();
using (var reader = cmd.ExecuteReader()) {
while (reader.Read()) {
int id = int.Parse(reader["ID"].ToString());
Decimal price = Decimal.Parse(reader["PRICE"].ToString());
List<Decimal> list;
if (result.TryGetValue(id, out list))
list.Add(price);
else
result.Add(id, new List<Decimal> {price});
}
}