2017-05-29 15 views
-2

私は6人の医師がこのようにリストされています:(一例)。リストのメンバーを別のリストに割り当てる

ListDoctor.Add(new Medico(01, "Antonio", 555444333, "[email protected]", "Dermatologista")); 

私はこれらの6人の医師、このリストの1人のメンバー(20人のメンバー)をそれぞれ割り当てたいと思います。

ListSickPeople.Add(new Utente(100001, "Pedro", 914754123, "[email protected]", GetRandomColor())); 

これは病院のようなものです、私は、患者が割り当てられて持っている各医者にしたいが、それは、カラーhierarqyを尊重しなければなりません。

これは私が使用したカラーコードです。

重力の順序は、プログラムを開始するたびにランダムに割り当てられているマゼンタ、レッド、イエロー、グリーンです。

+0

医者のいずれも患者の財産を持っておらず、患者も医者の財産を持っていません –

+0

しかしこれを行うには、各クラスにプロパティを追加する必要がありますか? – Dany4k

+0

私はちょうど医者に何を割り当てるのか、そしてここで色がどのような役割を果たすのかは全く分かりません。私が間違っていると私を訂正してください - ランダムに割り当てられた20人の患者がいて、それらの患者を6人の医師に割り当てる必要があります。マゼンタ色の患者が最初に割り当てられるように、赤色の患者は無料の医師に割り当てられるか、すでにマゼンタ患者が割り当てられている医者にキューに追加されます。 –

答えて

1

これは宿題の質問のように聞こえるので、私は擬似コードで書くつもりです;)

まず、あなたがそれらをループすることができるように、例えば、優先度順に優先度の高い順から、あなたの色を注文します

colors = { Magenta, Red, Yellow, Green } 

セルゲイは医者が割り当てられているレコードへのPatientオブジェクト、およびドクターオブジェクトに対する患者のプロパティに医師のプロパティを追加し、示唆したように。

次に、患者をループする内部ループで色をループします。各患者について、その優先度が現在の色であるかどうかをチェックし、それを無料の医師の1人に割り当てる。無料の医者を見つけるには、患者がいない医者が見つかるまで、医者のところを繰り返します。例えば

foreach (var color in colors) 
    foreach (var patient in ListSickPeople) 
     if (patient.Color == color) 
     { 
      foreach (var doctor in ListDoctor) 
      { 
       if (doctor.Patient == null) 
        patient.Doctor = doctor 
        doctor.Patient = patient 
      } 
      if (patient.Doctor == null) // went through all doctors and they're all assigned, so add patient to queue 
       queue.Add(patient) 
     } 

あなたは、すべての医師がカウンターまたは削除することができ、そこから利用できる医師の第2のリストを持っていることによって割り当てられているとき、それは検出作ることができます。医師がすべて割り当てられたことを検出したら、一番上のループを終了します。

LINQを使用すると、読みやすくなります。しかし、これは一般的な考えを与えるはずです。

+1

DoctorクラスとPatientクラスにプロパティを追加したくない場合は、DoctorとPatientのプロパティまたはIDを持つクラスのように、関連付けを記録する別の方法が必要です。その後、医師や患者を探してテーブルをループし、医師を複数回割り当てないようにする必要があります。クラス自体にプロパティを持たせることで、一対一の関係が明確になり、強制されます。 –

+0

あなたの甘えをありがとう、試してみて報告してください。私はそれらのプロパティを追加することができます、それを行うより簡単な方法のようです。 Imは色= {Magenta、Red、Yellow、Green}の行をどこに追加すればいいですか? – Dany4k

+0

これを行うには、静的なConsoleColor []カラーを再配置するか、それらのカラーで列挙型を作成することができます。 –

1

現在の色のリストには色の優先度は表示されません。色はランダムな順序で表示されます。あなたが今しなければならないのは、優先順位によってソート患者である

static ConsoleColor[] ticketPriorities = { // give descriptive name to list of priorities 
     ConsoleColor.Green, 
     ConsoleColor.Yellow, 
     ConsoleColor.Red, 
     ConsoleColor.Magenta 
    }; 

とに割り当てる:あなたはまだConsoleColorsを(下記の注意事項を参照)を使用したい場合は、少なくともその順番で各色の優先順位を定義する必要があります医者。それは、順序付けられた患者のリスト内の患者の指標によって行うことができる。すべてが単一のLINQクエリによって行われます。

var assignments = ListSickPeople 
    .OrderByDescending(p => ticketPriorities.IndexOf(p.Priority)) 
    .Select((patient,index) => 
     new { 
      Patient = patient, 
      Doctor = ListDoctor[index % ListDoctor.Count] 
     }); 

これは、患者と医師の割り当てを順序付けしたペアを提供します。


注 - お客様のビジネスルールではUIの項目であるConsoleColorを使用することは好ましくありません。優先順位としてカラー名を使用することはできますが、システムコンソールでサポートされている色ではなく、患者優先度のドメイン概念でなければなりません。例えば ​​-

public enum TicketPriority 
{ 
    Low,  // Green 
    Normal, // Yellow 
    High, // Red 
    Top  // Magenta 
} 

ConsoleColorのもう一つの問題は、あなたが患者の優先順位に任意のコンソールの色を割り当てることができるということです。それはむしろ、チケットのデザインよりも優先順位を意味する名前を使用する方が良いでしょうけどWhiteまたはBlack

このような事前定義された課題のもう1つの問題は、医者への訪問のたびに全く同じ時間(たとえば15分)がかかることです。さもなければ、より優先順位の低い患者は、優先順位の高い患者の前に自分の医者を訪問することができる。それを解決するには、医者のプールを作成して、無料の患者の待ち行列(Queye<T>)に次の患者を連れていかなければなりません。

+0

あなたの渋滞は良いですが、これはルールを持つプロジェクトの一部です。これらのルールの1つは、優先順位を割り当てるために色を使用することです。それはあなたの摂取を使用して簡単になるだろうが、私はそれを行うことはできません。 – Dany4k

+0

@ Dany4k私の答えは色の名前を変更することではありません。それはあなたがスキップすることができる単なる提案です –

関連する問題