c# - 计算字母评估量表的差异
问题描述
我有一个像这样的评估字母表:
我有一个System.Data.DataTable
列Current risk
中有一个可能的值,列中有一个Forward risk
这个值,我需要计算当前风险和远期风险之间的差异,并将这个结果放在另一列中。以这种方式计算差异:
示例:
如果当前 = AAA 并且正向 = AA+ --> 差值 = -1
如果当前 = AAA 且正向 = AAA --> 差值 = 0
如果当前 = AAA 且正向 = AA --> 差值 = -2
如果当前 = AAA 且正向 = AA- --> 差值 = -3
如果当前 = AA+ 且正向 = AAA --> 差值 = +1
如果当前 = AA 且正向 = AAA --> 差值 = +2
如果电流 = A 且正向 = AAA --> 差值 = +5
我正在使用 C# .net 框架,我想到的唯一解决方案是使用大量的 if-then,但我想知道是否有更好、更优雅的解决方案来解决这个问题。谢谢你
解决方案
如果您创建一个Dictionary
将风险字符串映射到整数,那么您可以只处理 中的每一行DataTable
来更新一列。
首先,计算地图:
var RiskValue = "AAA".AsSingleton()
.Concat(new[] { "AA", "A", "BBB", "BB", "B", "CCC" }.SelectMany(r => new[] { "+", "", "-" }.Select(suffix => r + suffix)))
.Concat(new[] { "CC", "C", "D" })
.Select((r, v) => new { r, v })
.ToDictionary(rv => rv.r, rv => rv.v);
然后使用值更新差异列:
foreach (var r in dt.AsEnumerable())
r["Risk Difference"] = RiskValue[r.Field<string>("Current risk")] - RiskValue[r.Field<string>("Forward risk")];
PS 我的地图计算使用扩展将对象转换为,IEnumerable<T>
但您也可以使用new[] { object }
.
public static IEnumerable<T> AsSingleton<T>(this T first) {
yield return first;
}
推荐阅读
- c - 为什么我的代码在通过凯撒密码转换字母时会跳过空格和标点符号?
- ios - 如何让 UIButtons 跟随静态图像的大小调整?
- http - Autoit:HTTP 请求,如何登录网站
- javascript - jqueryUI,如果“drop to”容器满足要求,则接受
- django - 如何在 Django 社交登录上创建用户限制列表
- asp.net-mvc - 如果我删除 ApiController 控制器的 api/ 级别,如何使 Controller 和 ApiController 控制器在同一个项目中工作
- python - 为什么 PyGame 在延迟或睡眠之前没有在窗口中绘制?
- tensorflow - 是否可以在 Flutter App 上同时运行两个 TFLite 模型?/ 让 Teachable Machine 识别物体何时不存在?
- javascript - React-hooks 在点击时处理多个按钮状态
- sql - sql中月份的累积和缺失值