我有一个按字母顺序排列的等级,如下所示:
我有一个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 -然后,但我想知道是否有一个更好和优雅的解决方案来解决这个问题。谢谢
发布于 2020-08-03 21:42:04
如果创建一个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;
}发布于 2020-08-02 01:27:51
我首先创建一个类并映射每个风险的值。根据所显示的例子,对于A组,我得出的结论是,值映射如下:
存储数据的类:
class Score
{
public int Value { get; set; }
public string Name { get; set; }
}示例代码显示将“A”组添加到列表中,并正确计算风险差异。
List<Score> scoreList = new List<Score>();
scoreList.Add(new Score { Name = "A-", Value = 0 });
scoreList.Add(new Score { Name = "A", Value = 1 });
scoreList.Add(new Score { Name = "A+", Value = 2 });
scoreList.Add(new Score { Name = "AA-", Value = 3 });
scoreList.Add(new Score { Name = "AA", Value = 4 });
scoreList.Add(new Score { Name = "AA+", Value = 5 });
scoreList.Add(new Score { Name = "AAA", Value = 6 });
//If Current = AAA and Forward = AA+ --> Difference = -1
var difference = scoreList.SingleOrDefault(i => i.Name == "AA+").Value - scoreList.SingleOrDefault(i => i.Name == "AAA").Value;
//If Current = AAA and Forward = AAA-- > Difference = 0
var difference1 = scoreList.SingleOrDefault(i => i.Name == "AAA").Value - scoreList.SingleOrDefault(i => i.Name == "AAA").Value;
//If Current = AAA and Forward = AA-- > Difference = -2
var difference2 = scoreList.SingleOrDefault(i => i.Name == "AA").Value - scoreList.SingleOrDefault(i => i.Name == "AAA").Value;
//If Current = AAA and Forward = AA - --> Difference = -3
var difference3 = scoreList.SingleOrDefault(i => i.Name == "AA-").Value - scoreList.SingleOrDefault(i => i.Name == "AAA").Value;
//If Current = AA + and Forward = AAA-- > Difference = +1
var difference4 = scoreList.SingleOrDefault(i => i.Name == "AAA").Value - scoreList.SingleOrDefault(i => i.Name == "AA+").Value;
//If Current = AA and Forward = AAA-- > Difference = +2
var difference5 = scoreList.SingleOrDefault(i => i.Name == "AAA").Value - scoreList.SingleOrDefault(i => i.Name == "AA").Value;
//If Current = A and Forward = AAA-- > Difference = +5
var difference6 = scoreList.SingleOrDefault(i => i.Name == "AAA").Value - scoreList.SingleOrDefault(i => i.Name == "A").Value;希望这能让你开始工作。
https://stackoverflow.com/questions/63211216
复制相似问题