首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字母评价量表中的差额计算

字母评价量表中的差额计算
EN

Stack Overflow用户
提问于 2020-08-02 00:16:43
回答 2查看 56关注 0票数 1

我有一个按字母顺序排列的等级,如下所示:

在这里输入图像描述

我有一个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 -然后,但我想知道是否有一个更好和优雅的解决方案来解决这个问题。谢谢

EN

回答 2

Stack Overflow用户

发布于 2020-08-03 21:42:04

如果创建一个Dictionary将风险字符串映射到整数,则可以只处理DataTable中的每一行以更新列。

首先,计算地图:

代码语言:javascript
运行
复制
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);

然后用以下值更新差异列:

代码语言:javascript
运行
复制
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 }

代码语言:javascript
运行
复制
public static IEnumerable<T> AsSingleton<T>(this T first) {
    yield return first;
}
票数 1
EN

Stack Overflow用户

发布于 2020-08-02 01:27:51

我首先创建一个类并映射每个风险的值。根据所显示的例子,对于A组,我得出的结论是,值映射如下:

  • A-值:0
  • A值:1
  • A+值:2
  • AA值:3
  • AA值:4
  • AA+值:5
  • AAA值:6

存储数据的类:

代码语言:javascript
运行
复制
class Score
{
    public int Value { get; set; }
    public string Name { get; set; }
}

示例代码显示将“A”组添加到列表中,并正确计算风险差异。

代码语言:javascript
运行
复制
        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;

希望这能让你开始工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63211216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档