2011-07-07 13 views
1

私は予測と実際の結果に基づいて予測とスコアポイントを記入できるようにするアプリケーションを作ろうとしています。予測とスコアリングシステムの計算には、どのような設計上の決定が優れていますか?

私は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クラス:

+0

あなたがしていることは私にはあまり明確ではありません。 Driverクラスには何がありますか?なぜあなたのすべての指標は連続していますか?もしそうなら、辞書の代わりに配列を使うのはどうですか? int points [] = new int [] {25、18、15、12、10}; –

+0

私はドライバークラスを追加して、連続したことが何であるかを説明しました(これはフィニッシュポジションです)。私は辞書が必要です(私は思う)。位置に属する点。 –

+0

しかし、位置がシーケンシャルな場合は、辞書ではなく配列を使用します。ディクショナリ(またはソートリスト)は、データが不十分で検索が必要な場合に使用します。たとえば、あなた自身のドライバに辞書を使用すると、IDが1または1002である可能性があるため、IDで検索することができます。 –

答えて

0
public class Driver : IEquatable<Driver> 
    { 
     public int DriverId { get; private set; } 
     public string Name { get; private set; } 

     public Driver(int driverId, string name) 
     { 
      DriverId = driverId; 
      Name = name; 
     } 

     public override bool Equals(object obj) 
     { 
      return Equals(obj as Driver); 
     } 

     public bool Equals(Driver other) 
     { 
      return other != null && other.DriverId == DriverId; 
     } 

     public override int GetHashCode() 
     { 
      return DriverId.GetHashCode(); 
     } 
    } 

予測位置によって連続しているので、それらは配列でなければなりません。点は順番に並んでいるので、配列でなければなりません。辞書の使用には意味がありません。ただし、IDでドライバを検索する場合は、IDがキーであり、位置は順次ではなく、ドライバのDictionaryまたはSortedListを作成する必要があります。したがって、2つの配列を持つことになります。

Driver[] predictions = new Driver[] 
{ 
    new Driver(10, "Michael Schumacher"), 
    new Driver(8, "Jensen Button") 
    new Driver(7, "Felipe Massa") 
    new Driver(9, "Fernando Alonso") 
}; 

予測[0]は位置1の予測です。同様に、点の配列を使用します。

int[] points = new int[] { 25, 18, 15, 12, 10 }; 

点[0]は位置1の点です。

DriverResultsを使用する代わりに、DriverPointsとStartPositionのような他のフィールドをDriverに追加することを検討してください。次に、配列内のDriverクラスを更新するだけです。

編集:さまざまなレース、テスト、シーズンなどの結果を保存するには、DriverResultsというクラスを作成し、RaceResultsやSeasonResultsなどのクラスを継承します。ドライバにメンバーを追加します。

List<DriverResults> Results { get; set; } 

今、あなたはSeasonResultsやRaceResultsを作成し、必要なだけの結果を格納し、このリストに追加することができます。

+0

はい、それらの配列は良い考えです。ドライバーにDriverPointを持つことの問題は、レースのポイント、シーズンのポイント、キャリアのポイントなどいくつかの種類のポイントがあるということですね。しかし、それは私と一緒に座っていないレースのポイントです。それは本当にドライバーに属していますか?私はドライバーに物事が必要かもしれないが、レース関連のものではない状況があるかもしれない(ドライバーのプロフィールページかもしれない)。 –

+0

DriverResultsというクラスを作成します。すべての種類の結果(RaceResults、TestResults、SeasonResultsなど)はすべてDriverResultsから派生しています。その後、Driver "List Results"にメンバーを追加し、それらのすべてを必要な回数だけそこに格納することができます。 –

+0

すべての素晴らしいアイデアをありがとう! –

関連する問題