将列表成员分配给另一个列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将列表成员分配给另一个列表相关的知识,希望对你有一定的参考价值。
我有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)];
}
重力的顺序是洋红色,红色,黄色和绿色,我每次开始我的程序时都会随机分配。
这听起来像是一个家庭作业问题,所以我打算写伪代码;)
首先,将您的颜色从最高优先级排序到最低优先级,以便您可以按优先级顺序循环它们,例如
colors = { Magenta, Red, Yellow, Green }
正如谢尔盖建议的那样,将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会使它更具可读性。但这应该给出一般的想法。
您当前的颜色列表不显示颜色的优先级 - 它们只是随机顺序。如果您仍想使用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
的另一个问题是你可以为患者优先分配任何控制台颜色 - 例如White
或Black
。
并且这种预定义分配的另一个问题是每次访问医生应该完全相同的时间(例如15分钟)。否则,优先级较低的患者可以在一些高优先级患者之前去看医生。为了解决这个问题,你应该创建一个医生池,一旦他们获得自由,就会将下一位病人带到有序病人的队列(Queue<T>
)中。
以上是关于将列表成员分配给另一个列表的主要内容,如果未能解决你的问题,请参考以下文章
如何测试字符串包含列表中的元素并通过 Pandas 将目标元素分配给另一列