【问题标题】:Assign members of a list to another list将列表的成员分配给另一个列表
【发布时间】:2017-10-29 23:57:15
【问题描述】:

我列出了 6 位医生,如下所示:(一个示例)。

ListDoctor.Add(new Medico(01, "Antonio", 555444333, "antonio@gmail.com", "Dermatologista"));

我想为这 6 位医生中的每一个分配此列表中的 1 位成员(20 位成员)。

ListSickPeople.Add(new Utente(100001, "Pedro", 914754123, "pedro@gmail.com", GetRandomColor()));

这就像一家医院,我希望每个医生都有分配患者,但它必须尊重颜色等级。

这是我使用的颜色代码。

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

    {

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

重力的顺序是洋红色、红色、黄色和绿色,我每次启动程序时都会随机分配。

【问题讨论】:

  • 不清楚您期望什么样的结果 - 医生没有患者属性,患者也没有医生属性
  • 但要做到这一点,我是否必须在每个类上添加一个属性?
  • 我只是说完全不清楚将患者分配给医生是什么意思,颜色在这里扮演什么角色。如果我错了,请纠正我 - 您有 20 名患者随机分配了颜色,您需要将这些患者分配给 6 位医生。这样会先分配洋红色的患者,然后将红色的患者分配给空闲医生,或者添加到已经分配了洋红色患者的医生的队列中,等等
  • 我必须输出一个治疗病人的医生名单。但我只有6个医生和20个病人。我需要将 1 名患者分配给 1 名医生,但要尊重颜色等级。如果有 3 个洋红色,则它们都具有优先权。接下来是红军,以此类推。
  • 每个医生都有患者名单,还是每个医生有一个患者?

标签: c# list menu assign


【解决方案1】:

这听起来像是一道作业题,所以我打算用伪代码来写;)

首先,将颜色从最高优先级排序到最低优先级,以便您可以按优先级顺序循环它们,例如

colors = { Magenta, Red, Yellow, Green }

按照 Sergey 的建议,将 Doctor 属性添加到 Patient 对象以记录分配的医生,并将 Patient 属性添加到 Doctor 对象。

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

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 会使其更具可读性。但这应该给出一般的想法。

【讨论】:

  • 如果您真的不想向 Doctor 和 Patient 类添加属性,那么您将需要另一种方法来记录它们的关联,例如具有 Doctor 和 Patient 属性或其 ID 的类。然后,您必须在表格中循环查找医生或患者,并确保您不会多次指定医生。拥有类本身的属性可以阐明并加强一对一的关系。
  • 感谢您的建议,尝试一下并报告。我可以添加这些属性,似乎是更简单的方法。我只是困惑我在哪里添加颜色= {洋红色,红色,黄色,绿色}的线。
  • 您可以重新排列静态 ConsoleColor[] 颜色来执行此操作,或者使用这些颜色创建一个枚举。
  • 好的,我将尝试编辑静态 ConsoleColor 并报告结果。再次感谢!
  • 这是编辑颜色属性的正确方法吗?
【解决方案2】:

您当前的颜色列表不显示颜色的优先级 - 它们只是按随机顺序排列的。如果您仍想使用 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 是不好的。您仍然可以使用颜色名称作为优先级,但这应该是患者优先级的域概念,而不是系统控制台支持的颜色。虽然最好使用表示优先级的名称而不是票的设计:

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

ConsoleColor 的另一个问题是您可以将任何控制台颜色分配给患者优先级 - 例如。 WhiteBlack

这种预定义分配的另一个问题是每次看医生都应该花费完全相同的时间(例如 15 分钟)。否则,优先级较低的患者可以先于一些优先级较高的患者去看医生。为了解决这个问题,您应该创建一个医生池,以便在他们有空后立即将下一位患者加入有序患者的队列 (Queue<T>)。

【讨论】:

  • 您的建议很好,但这是有规则的项目的一部分。这些规则之一是使用颜色来分配优先级。使用你的建议会更容易,但我不能这样做。
  • @Dany4k 我的回答不是关于重命名颜色。这只是一个建议,您可以跳过
猜你喜欢
  • 2012-06-24
  • 2017-07-11
  • 1970-01-01
  • 2018-04-03
  • 2021-04-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多