1
votes

Calculer la différence dans l'échelle d'évaluation alphabétique

J'ai une échelle alphabétique d'évaluation comme celle-ci:

entrez la description de l'image ici

J'ai un System.Data.DataTable qui dans la colonne Current risk a l'une de ces valeurs possibles et dans la colonne Forward risk nouveau une de ces valeurs et je dois calculer la différence entre le risque actuel et le risque à terme et mettre ce résultat dans une autre colonne. La différence est calculée de cette manière:
Exemples:

Si courant = AAA et avant = AA + -> différence = -1

Si courant = AAA et avant = AAA -> différence = 0

Si courant = AAA et avant = AA -> Différence = -2

Si courant = AAA et avant = AA- -> Différence = -3

Si courant = AA + et avant = AAA -> différence = +1

Si courant = AA et avant = AAA -> Différence = +2

Si courant = A et avant = AAA -> Différence = +5

J'utilise le framework C # .net et la seule solution que j'ai à l'esprit est avec des tonnes de si-alors, mais j'aimerais savoir s'il existe une solution meilleure et élégante à ce problème. Merci


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser un tableau ou un List<T> , ou toute sorte de collection que vous voulez vraiment.

// insert what ever you like (this was only an example)
private static readonly string[] _array = new[] {"AAA", "AA+", "AA", "A+", "A", "BBB", "BB+"};

private static int Difference(string a, string b)
   => Array.IndexOf(_array, a) - Array.IndexOf(_array, b);

...

Console.WriteLine(Difference("AAA", "A+"));

Remarque : ce n'était qu'un exemple et l'une des nombreuses solutions que vous pourriez créer. Dans cet exemple, vous pouvez remplir le tableau à votre guise ou utiliser la collection de votre choix. Vous devriez avoir une certaine tolérance aux pannes et valider l'entrée, etc.

Une autre option serait un dictionnaire de string et int.


0 commentaires

0
votes

Je créerais d'abord une classe et mapperais les valeurs de chaque risque. Sur la base des exemples présentés, pour le groupe A, je suis arrivé à la conclusion que le mappage de valeurs était comme ceci:

  • A- Valeur: 0
  • Une valeur: 1
  • Valeur A +: 2
  • AA- Valeur: 3
  • Valeur AA: 4
  • Valeur AA +: 5
  • Valeur AAA: 6

La classe pour stocker ces données:

        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;

Un exemple de code montre l'ajout du groupe «A» à la liste et le calcul correct de la différence de risque.

class Score
{
    public int Value { get; set; }
    public string Name { get; set; }
}

J'espère que cela vous aidera à démarrer.


0 commentaires

1
votes

Si vous créez un Dictionary pour mapper des chaînes de risque à des entiers, vous pouvez simplement traiter chaque ligne du DataTable pour mettre à jour une colonne.

Commencez par calculer la carte:

public static IEnumerable<T> AsSingleton<T>(this T first) {
    yield return first;
}

Ensuite, mettez à jour la colonne de différence avec les valeurs:

foreach (var r in dt.AsEnumerable())
    r["Risk Difference"] = RiskValue[r.Field<string>("Current risk")] - RiskValue[r.Field<string>("Forward risk")];

PS Le calcul de ma carte utilise une extension pour convertir un objet en IEnumerable<T> mais vous pouvez également utiliser new[] { object } .

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);


0 commentaires