私は予測と実際の結果に基づいて予測とスコアポイントを記入できるようにするアプリケーションを作ろうとしています。予測とスコアリングシステムの計算には、どのような設計上の決定が優れていますか?
私はGetPointsPrediction()と呼ばれるこのメソッドを持っています。今のところ、予測は次の形式になります。
Dictionary<int, Driver> predictions = new Dictionary<int, Driver>
{
{1, new Driver(10, "Michael Schumacher")},
{2, new Driver(8, "Jensen Button")},
{3, new Driver(7, "Felipe Massa")},
{4, new Driver(9, "Fernando Alonso")}
};
整数は、ユーザーがドライバが終了すると考える位置です。今、予測と結果に基づいてポイントを計算できるようにする必要があります。ポイントを与えるためには、結果に3つの情報、つまりポジション、ドライバー、ポイントが必要です。
予測された位置で正確に終了したドライバはフルポイントを受け取ります。予測された位置で終了していないが、トップ10に入っているドライバーは減点を得る。
表示されるすべての連続番号が位置です。
策番号1:
Dictionary<int, Driver> results = new Dictionary<int, Driver>
{
{1, new Driver(10, "Michael Schumacher")},
{2, new Driver(8, "Jensen Button")},
{3, new Driver(9, "Fernando Alonso")}
};
Dictionary<int, int> points = new Dictionary<int, int>
{
{1, 25},
{2, 18},
{3, 15},
{4, 12},
{5, 10}
};
溶液番号2:
がルックアップとして使用される各位置のためのポイントと別の結果セット、及び辞書を持っています
ポイントと結果をマージします。
Dictionary<int, Dictionary<int, Driver>> results = new Dictionary<int, Dictionary<int, Driver>>
ソリューション番号3:
がすべてを保持することができ、クラスのいくつかの種類を考え出す:
public class DriverResult
{
public Driver Driver { get; private set; }
public int Points { get; private set; }
public int StartPosition { get; private set; }
public int FinishPosition { get; private set; }
}
そして
IEnumerable<DriverResult> raceResults = new List<DriverResult>
私は解決策番号3を好きですが、私はそれが十分にコヒーレントではないと感じているし、名前も気分が良くない。ソリューション2はおそらく実際に使用するには醜いかもしれません。ソリューション1は実際に、正しく予測されたドライバをIntersectで分離する良い方法を提供します。
多分私は考えていない他の解決策があります。これらの意思決定に関するベストプラクティスは何ですか?
Driverクラス:
あなたがしていることは私にはあまり明確ではありません。 Driverクラスには何がありますか?なぜあなたのすべての指標は連続していますか?もしそうなら、辞書の代わりに配列を使うのはどうですか? int points [] = new int [] {25、18、15、12、10}; –
私はドライバークラスを追加して、連続したことが何であるかを説明しました(これはフィニッシュポジションです)。私は辞書が必要です(私は思う)。位置に属する点。 –
しかし、位置がシーケンシャルな場合は、辞書ではなく配列を使用します。ディクショナリ(またはソートリスト)は、データが不十分で検索が必要な場合に使用します。たとえば、あなた自身のドライバに辞書を使用すると、IDが1または1002である可能性があるため、IDで検索することができます。 –