2017-05-29 103 views
-2

我有6位医生被列为这样:(一个例子)。将列表中的成员分配给另一个列表

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

我想分配给这6个医生中的每一个,这个清单的成员(20个成员)。

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

这就像是一家医院,我希望每个医生都要分配患者,但必须尊重颜色层次。

这是我使用的颜色代码。

static ConsoleColor[] colors = { ConsoleColor.Red, ConsoleColor.Green, ConsoleColor.Yellow, ConsoleColor.Magenta }; //Ticket Colors. 
    static ConsoleColor GetRandomColor() 

    { 

     return colors[random.Next(colors.Length)]; 
    } 

重力的顺序是洋红色,红色,黄色和绿色,我每次开始我的程序随机分配。

+0

目前尚不清楚你期望得到什么样的结果 - 医生既没有患者财产,也没有患者拥有医生财产 –

+0

但是为了做到这一点,我是否必须为每个班级添加一个房产? – Dany4k

+0

我只是说完全不清楚*给医生分配病人*的意思和颜色在这里扮演的角色。如果我错了,纠正我 - 你有20个随机分配颜色的病人,你需要将这些病人分配给6名医生。因此,首先分配品红色的患者,然后将红色的患者分配给免费的医生,或者将其添加到已经分配了洋红色患者的医生的队列中等。 –

回答

1

这听起来像一个家庭作业的问题,所以我要去伪写;)

首先,为了你的颜色从最高优先级到最低,让您可以遍历它们的优先级顺序例如

colors = { Magenta, Red, Yellow, Green } 

正如谢尔盖建议,在医生属性添加到病人的对象,记录该医生被分配和患者属性对医生的对象。

接下来,用循环遍布患者的内部循环遍历颜色。对于每位患者,检查其优先级是否为当前颜色,并为其分配一名免费医生。要找到一位免费的医生,请绕过医生,直到找到没有患者的医生。例如

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) 
     } 

你可以把它当检测到所有的医生都被分配了一个柜台或通过其提供医生从中可以删除的第二列表。一旦检测到医生全部被分配,退出顶部循环。

使用LINQ会使它更具可读性。但是这应该给出一般的想法。

+1

如果你真的不想为医生和患者类添加属性,那么你需要另一种方式来记录他们的关联,比如具有医生和病人属性或他们的ID的类。然后,您必须循环查找医生或患者,并确保您不会多次分配医生。拥有类的属性本身就可以阐明和执行一对一的关系。 –

+0

感谢您的消化,请尝试并报告。我可以添加这些属性,似乎是更简单的方法。我只是困惑我在哪里添加颜色= {洋红色,红色,黄色,绿色}线。 – Dany4k

+0

您可以重新排列您的静态ConsoleColor []颜色来执行此操作,或使用这些颜色创建枚举。 –

1

您当前的颜色列表不显示颜色的优先级 - 它们只是随机排列的。如果你仍然想使用ConsoleColors(见下面的注释),那么你至少应该由它们的顺序确定每个颜色的优先级:

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

所有你现在要做的是排序患者按优先级,并将其分配给医生。这可以通过订购患者列表中患者的索引来完成。一切都是通过单个LINQ查询完成的:

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

这将为您提供有序的病人医生作业配对。


请注意 - 这是不好使用ConsoleColor这是在您的业务规则中的UI的事情。您仍然可以使用颜色名称作为优先级,但这应该是患者优先级的域概念,而不是系统控制台支持的颜色。虽然它是更好地使用这意味着优先的名称,而不是门票的设计:

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

ConsoleColor的另一个问题是,你可以在任何控制台颜色分配给病人优先 - 例如WhiteBlack

这样的预定义分配的另一个问题是每次去看医生都应该完全相同的时间(例如15分钟)。否则,优先级较低的患者可以在一些高优先级患者之前就诊。为了解决这个问题,您应该创建一个医生池,一旦他们获得免费,将会将下一位患者排入患者队列(Queye<T>)。

+0

你的消化很好,但这是有规则的项目的一部分。其中一条规则是使用颜色来分配优先级。使用你的消化会更容易,但我不能那样做。 – Dany4k

+0

@ Dany4k我的答案不是重命名颜色。这只是一个你可以跳过的建议 –

相关问题