能否向Dictionary添加多个元素?如何计算字典中各列的总和?
问题解答
问题1:能否向Dictionary中添加多个元素?
可以,但要注意Dictionary的键是唯一的,不能为同一个键重复调用Add方法(会抛出ArgumentException)。如果需要给单个键关联多个值,常用两种方案:
- 使用
Dictionary<TKey, List<TValue>>,把值存储为集合类型; - 自定义包含多个字段的类作为值类型,将多个数据封装到类实例中。
你当前代码里的else分支试图多次给同一个row.Borrower键添加值,这是错误的,会直接抛出异常。
问题2:如何计算数据库查询结果对应各列的总和并生成指定格式的Dictionary?
你的需求是计算全局各列的总和并生成指定键的字典,当前代码逻辑完全偏离(错误地按borrower分组累加),以下是两种可行实现方案:
方案1:数据库端聚合(推荐,性能更优)
直接让数据库计算总和,避免内存遍历大量数据:
public async Task<Dictionary<string, string>> GetStats() { // 修改SQL,直接聚合各列总和 var sqlStatement = @" SELECT SUM(id) AS IdSum, SUM(collateral_amount) AS CollateralSum, SUM(withdraw_amount) AS WithdrawSum, SUM(total_amount_to_treasure) AS TotalSum FROM table"; // 查询聚合结果(用匿名类接收即可) var stats = await _databaseConnection.QueryFirstOrDefaultAsync(sqlStatement); // 生成指定格式的字典 return new Dictionary<string, string> { ["id"] = stats.IdSum?.ToString() ?? "0", ["collateral_amount"] = stats.CollateralSum?.ToString() ?? "0", ["withdraw_collateral"] = stats.WithdrawSum?.ToString() ?? "0", // 对应原withdraw_amount列 ["total_amount"] = stats.TotalSum?.ToString() ?? "0" // 对应原total_amount_to_treasure列 }; }
方案2:内存端聚合
如果必须在内存中处理查询结果(比如需要先做其他逻辑),可以初始化累加变量遍历计算:
public async Task<Dictionary<string, string>> GetStats() { var sqlStatement = "SELECT id, collateral_amount, withdraw_amount, total_amount_to_treasure FROM table"; var queryResult = await _databaseConnection.QueryAsync<StatsModel>(sqlStatement); // 初始化累加变量,默认值为0 long idSum = 0; long collateralSum = 0; long withdrawSum = 0; long totalSum = 0; foreach (var row in queryResult) { // 累加各列值,注意处理null情况 idSum += row.Id ?? 0; collateralSum += row.CollateralAmount ?? 0; withdrawSum += row.WithdrawAmount ?? 0; totalSum += row.TotalAmountToTreasure ?? 0; } // 生成目标字典 return new Dictionary<string, string> { ["id"] = idSum.ToString(), ["collateral_amount"] = collateralSum.ToString(), ["withdraw_collateral"] = withdrawSum.ToString(), ["total_amount"] = totalSum.ToString() }; }
注意事项
- 原代码中
StatsDomain的构造函数调用明显错误(多次传入同一个item.Value),如果需要返回StatsDomain[]类型,可以根据生成的字典创建对应实例; - 处理数据库返回的
null值时,用?? 0确保累加不会出现异常; - 字典的键要严格匹配需求中的
collateral_amount、id、withdraw_collateral、total_amount。
内容的提问来源于stack exchange,提问作者test_
相关产品推荐
相关产品推荐

