【问题标题】:C# version of PriorityQueue for compare用于比较的 C# 版本的 PriorityQueue
【发布时间】:2022-06-24 03:29:03
【问题描述】:

我有以下 Java 代码,并希望在 C# 中实现相同的功能。 请推荐

    PriorityQueue<Integer> pQ= new PriorityQueue<Integer>((x,y)->Integer.compare(y, x));

我确实将 Integer 转换为 int 但没有帮助。

.NET 版本

【问题讨论】:

  • 在 C# 中,您需要指定优先级队列持有的类型以及优先级队列应该使用什么类型来确定优先级。在您的情况下,只需 var pq = new PriorityQueue&lt;int, int&gt;(); 就可以了。见my demo。请注意,PriorityQueue 类仅存在于 .NET 6 及更高版本中
  • 不幸的是..正在使用低于 6 的版本..
  • 将编辑我的问题
  • @DotNetDev19 .NET 6 的源代码在 github 上可用。只需从 that source 复制并使用该副本,直到升级到 .net 6。

标签: c# priority-queue


【解决方案1】:

如果您使用的是 .NET Framework 6(或更高版本),您只需要:

var pQ = new PriorityQueue<int, int>();

如果你添加项目,你可以给他们一个优先级(第二个参数):

pQ.Enqueue(1, 100);
pQ.Enqueue(2, 10);
// ...

或者你有一个复杂的逻辑想要重用,然后使用自定义比较器:

public class MyFancyIntComparer : IComparer<int>
{
    public int Compare(int x, int y)
    {
        // replace following with a fancy logic
        return x.CompareTo(y);
    }
}

var pQ = new PriorityQueue<int, int>(new MyFancyIntComparer());

如果您使用的是较低版本的 .NET 框架,您可以使用(复制和粘贴)这些内部 PriorityQueue:https://referencesource.microsoft.com/#q=priorityqueue

【讨论】:

  • 谢谢..但我有较低的版本
  • 仅供参考/FWIW .NET 6 不是 .NET Framework 的一个版本,它是 .NET Core 5。出于营销原因,MS 决定将 .NET Core 重命名为简单的 .NET从他们以 .NET 5 的名称发布的 .NET Core 4 开始。为什么 MS 决定重命名 .NET Core,以及为什么 MS 决定将 .NET Core 重命名为容易与 .NET Framework 混淆的东西,我无法理解。参考源中的 PriorityQueue 类也与 .NET 6 PriorityQueue 有很大不同
【解决方案2】:

如果您使用的是 .Net 6 及更高版本,您可以将 Comparer 与 PriorityQueue 一起使用:

对于递增顺序:

PriorityQueue<int,int> pq = new PriorityQueue<int,int>(Comparer<int>.Create((a,b)=>a-b));

或降序:

PriorityQueue<int,int> pq = new PriorityQueue<int,int>(Comparer<int>.Create((a,b)=>b-a));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多