【问题标题】:Creating a Priority queue创建优先队列
【发布时间】:2017-05-31 00:14:39
【问题描述】:

我需要创建一个优先队列,但我有点不知如何去做。 我有这 2 个列表。

        //Medic List
        ListaMedico.Add(new Medico(01, "Antonio", 555444333, "antonio@gmail.com", "Dermatologista"));
        ListaMedico.Add(new Medico(02, "Lucas", 555444333, "lucas78@gmail.com", "Cardiologista"));
        ListaMedico.Add(new Medico(03, "Duarte", 555444333, "Duarte90@gmail.com", "Otorrino"));
        ListaMedico.Add(new Medico(04, "Marcos", 555444333, "marcos123@gmail.com", "Clinica Geral"));
        ListaMedico.Add(new Medico(05, "Pedro", 555444333, "Pedro12@gmail.com", "Pediatra"));

           //Sick People List
            ListaUtente.Add(new Utente(100001, "Pedro", 914754123, "pedro@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100002, "Lucas", 974123214, "lucas91@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100003, "Rodrigo", 941201456, "rodrigo00@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100004, "Gaspar", 987453210, "gaspar@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100005, "Roberto", 974120219, "roberto@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100006, "Eduardo", 974120219, "edu@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100007, "Ismael", 974120219, "Isma@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100008, "Paulo", 974120219, "Paulo90@gmail.com", GetRandomColor()));
            ListaUtente.Add(new Utente(100009, "Ana", 974120219, "ana.90@gmail.com", GetRandomColor()));

我正在使用此代码为我的患者分配随机颜色。

    static ConsoleColor[] colors = { ConsoleColor.Red, ConsoleColor.Green, ConsoleColor.Yellow, ConsoleColor.Magenta }; // Cores disponíveis para usar nas Senhas
    static ConsoleColor GetRandomColor()
    {

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

我需要一个优先级队列,因为洋红色是优先级,然后是红色,然后是黄色,最后是绿色。我如何将一些患者分配给我的医生以尊重这种颜色层次?

【问题讨论】:

    标签: c# list queue hierarchy


    【解决方案1】:

    您可以根据您的优先级相应地定义枚举项的值,并检索按它排序的列表项。

    public enum ConsoleColor { Magenta = 1, Red =2, Yellow = 3, Green = 4 }
    
    
    ListaUtente.OrderBy(x => (int)x);
    

    【讨论】:

    • 感谢您的意见。要试试这个。
    • 它不工作,知道为什么吗?我是把它放在我的 main() 中还是需要创建一个新类。
    • @Dany4k 你创建了一个枚举。他发布了执行此操作的代码。
    【解决方案2】:

    您可以使用自定义 order by 来执行此操作,但您必须指定 如何按优先级排序

    例如:

    var orderedByPriority = ListaUtente.OrderBy(sick => 
        sick.Color == ConsoleColor.Magenta ? 1 :
        sick.Color == ConsoleColor.Red ? 2 :
        sick.Color == ConsoleColor.Yellow ? 3 : 4);
    

    使用此逻辑,您无需更改代码。

    【讨论】:

    • 我刚刚这样做了,但我在颜色上遇到了错误。 "不包含 Color 的定义,也没有扩展方法 Color。
    • @Dany4k 颜色就是一个例子。您需要将sick.Color 更改为sick.TheNameOfThePropertyThatHoldsTheColorValueOnTheObjectUtente
    • "sick" 是 Utente 对象的一个​​实例。在您的示例中,您没有提供 Utente 类定义的代码,因此我的示例中的“颜色”只是一个占位符属性。您需要将其更改为保存对象“Utente”中颜色的属性。
    【解决方案3】:

    关于优先级队列的主要内容是它应该跟踪在不同优先级添加的内容并保持它们的顺序。为此,您确实需要一个正确构造的数据结构,否则您将通过一遍又一遍地调用对内置 .NET 结构进行排序而结束它,这在语法上和性能上都很糟糕。

    这里有一个优先级队列的 int-priority 实现,应该可以正常工作:PriorityQueue source

    如果您需要该功能,这里有一个并发版本: ConcurrentPriorityQueue source

    int-ordered 优先级队列适用于枚举,因为枚举是添加了一些语法糖的整数类型。 :) 希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      相关资源
      最近更新 更多