首页 > 解决方案 > 计算字母评估量表的差异

问题描述

我有一个像这样的评估字母表:

在此处输入图像描述

我有一个System.Data.DataTableCurrent 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,但我想知道是否有更好、更优雅的解决方案来解决这个问题。谢谢你

标签: c#algorithmlinqdatatable

解决方案


如果您创建一个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;
}

推荐阅读