我有以下列表:
100 - > 1.0
99 - > 1.1
98 - > 1.1
97 - > 1.2
...
23-28 - > 5.6
...
0-5 - > 6.0
左侧是最大到达点,右侧是等级。
此列表包含大约40个不同的点 - >年级。所以我的程序正在计算考试的分数,最后应该说达到了100分,你得到了1.0分......达到了3分 - > 6.0 ...
根据我目前的知识,我只知道切换案例,但我认为这不是实现它的最佳方式。
答案 0 :(得分:2)
我将从您拥有的列表的数据结构开始。 (顺便说一下,这是假设C#6 - 对于早期版本的C#,您将无法使用自动实现的只读属性,但这是唯一的区别。)
public sealed class GradeBand
{
public int MinScore { get; }
public int MaxScore { get; } // Note: inclusive!
public decimal Grade { get; }
public GradeBand(int minScore, int maxScore, decimal grade)
{
// TODO: Validation
MinScore = minScore;
MaxScore = maxScore;
Grade = grade;
}
}
您可以使用以下内容构建列表:
var gradeBands = new List<GradeBand>
{
new GradeBand(0, 5, 6.0m),
...
new GradeBand(23, 28, 5.6m),
...
new GradeBand(100, 100, 1.0m),
};
你可能想要某种验证,乐队涵盖了整个等级。
然后有两个相当明显的选择来找到成绩。首先,没有预处理的线性扫描:
public decimal FindGrade(IEnumerable<GradeBand> bands, int score)
{
foreach (var band in bands)
{
if (band.MinScore <= score && score <= band.MaxScore)
{
return band.Grade;
}
}
throw new ArgumentException("Score wasn't in any band");
}
或者您可以预处理一次:
var scoreToGrade = new decimal[101]; // Or whatever the max score is
foreach (var band in bands)
{
for (int i = band.MinScore; i <= band.MaxScore; i++)
{
scoreToGrade[i] = band.Grade;
}
}
然后,您可以使用每个分数:
decimal grade = scoreToGrade[score];
答案 1 :(得分:0)
试试这个样本
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<int, double> dictionary =
new Dictionary<int, double>();
dictionary.Add(100, 1.0);
dictionary.Add(99, 1.1);
//Add more item here
// See whether Dictionary contains a value.
if (dictionary.ContainsKey(100))
{
double value = dictionary[100];
Console.WriteLine(String.Format("{0:0.0}",value));
}
Console.ReadLine();
}
}