0

我有一个要求,我在下面取一个 int(示例中的分数)并通过将其与各种范围条件进行比较来返回一个十进制值。如果分数在 1 到 10 之间,则测试自动失败并且不返回小数(在这种情况下,我返回字符串“FAILED”。高于 10 并根据分数匹配的范围返回相应的十进制值。这个这样做感觉不对,想知道是否有更好的方法。我考虑使用字典,每个范围例如 1 到 10 之间存储在一个键中,然后查询它以返回值。但是,我不确定如何这样做。任何人都可以提出更好的方法吗?

谢谢

public decimal GetTestScore(int score, out string status)
    {
        decimal score = 0m;
        string status = string.Empty;

        if(score >= 1 && score <= 10)
             status = FAILED;
        else if(score >= 10 && score <= 20)
            score = 1.0;
        else if(score >= 20 && score <= 30)
            score = 2.0;
        else if(score >= 30 && score <= 40)
            score = 3.0;
        return score;
    }
4

3 回答 3

0

那么首先返回一个可为空的小数,如果验证失败,只需返回 null。

public decimal? GetTestScore(int score)

另一个问题是:为什么感觉不对?对于简单的应用程序,这就足够了。

不要过度设计问题。

在您的情况下,字典的空间效率不高,因为您需要许多冗余值才能将范围映射到一个单一的分数值。

您的解决方案实际上是错误的,因为您正在比较 score <=20 然后对于下一个分数值 >=20 这是多余的(即使它表现正确)

编辑:如果约束是可投射的,您当然可以简化检查

    public decimal? GetTestScore(int score)
    {

        if (score >= 1 && score <= 10)
        {
            return null;
        }

        if (score < 1 || score > 40)
        {
            return 0;
        }

        return (score-1) / 10;
    }

再次编辑:添加边界条件

于 2013-09-10T08:22:57.260 回答
0

我认为这可能有效:

public decimal GetTestScore(int score, out string status)
{
    status = string.Empty;

    if (score < 10)
    {
        status = "FAILED";

        return 0m;
    }

    return Math.Ceiling(score / 10m);
}
于 2013-09-10T08:28:19.300 回答
0

如果您预测您的解决方案可能需要扩展以适应更多的分数定义,或者具有用户可配置的分数定义,您可以使用类似以下示例的内容:

public class ScoreResult
{
    public int Low { get; set; }
    public int High { get; set; }
    public string Status { get; set; }
    public double ReplacementScore { get; set; }

    public ScoreResult(int low, int high, string status, 
          double replacementScore)
    {
        Low = low;
        High = high;
        Status = status;
        ReplacementScore = replacementScore;
    }
}

public class ScoreCalculator
{
    private List<ScoreResult> _scores = new List<ScoreResult>();

    public ScoreCalculator()
    {
        /*These are easy to change and could be
          loaded from a database/service*/
        _scores.Add(new ScoreResult(1, 10, "FAILED", 0));
        _scores.Add(new ScoreResult(10, 20, string.Empty, 1));
        _scores.Add(new ScoreResult(20, 30, string.Empty, 2));
        _scores.Add(new ScoreResult(30, 40, string.Empty, 3));
    }

    public ScoreResult GetScoreResult(int score)
    {
        //Will return null if no match found
            return _scores.FirstOrDefault
                    (s => score >= s.Low && score <= s.High);
    }
}

示例用法:

    var result = GetScoreResult(9);
    Console.WriteLine(result.Status); //FAILED
    Console.WriteLine(result.ReplacementScore); //0.0

每个分数都可以由 的实例表示ScoreResult,这使得使用 Linq 很容易找到匹配项,并且很容易添加/删除/修改分数。您甚至可以将ScoreResult数据存储在数据库中,以便轻松配置。

于 2013-09-10T08:31:57.043 回答