c# - C# 中的 PriorityQueue 不适用于自定义比较器

标签 c# priority-queue icomparer

有人可以帮助我理解为什么这不起作用以及如何让它起作用吗?

PriorityQueue<Candidate, int> pq = 
   new PriorityQueue<Candidate, int>(new EstimateCompare());
    
public class EstimateCompare: IComparer<Candidate>
{
    public int Compare(Candidate a, Candidate b)
    {
        int diff = a.estimateDistance -b.estimateDistance;
        return diff == 0 ? 0 : diff < 0 ? 1 : -1;
    }
}

这是我得到的错误:

CS0535: 'EstimateCompare' does not implement interface member 'IComparer.Compare(int, int)' (in Solution.cs)

尝试像这样使用它,但出现此错误:

PriorityQueue<Candidate, int> pq = 
                    new PriorityQueue<Candidate, int>(new EstimateCompare());

public class EstimateCompare: IComparer<Candidate> {
      public int Compare(Candidate a, Candidate b) {
         return a.estimateDistance.CompareTo(b.estimateDistance);
     }

error CS1503: Argument 1: cannot convert from 'EstimateCompare' to 'System.Collections.Generic.IComparer?'

public class Candidate {
    int row;
    int col;
    int distanceSoFar;
    public int estimateDistance;
    
    public Candidate(int row, int col, int distanceSoFar, int estimateDistance) {
        this.row = row;
        this.col = col;
        this.distanceSoFar = distanceSoFar;
        this.estimateDistance = estimateDistance;
    }
}

非常感谢!!

最佳答案

您使用的构造函数是 PriorityQueue<TElement, TPriority>(IComparer<TPriority>) ,即TElementCandidate ,和TPriorityint ,所以参数应该是 IComparer<int> 的实例,但是EstimateCompareIComparer<Candidate> .

例如,如果您使用的是该示例,则该示例将编译

PriorityQueue<Candidate, Candidate> pq = 
    new PriorityQueue<Candidate, Candidate>(new EstimateCompare());

但是鉴于您的 Compare 的实现看起来,您可能不想要 IComparer根本没有,你可以用你的 PriorityQueue<Candidate, int> 来代替只需使用,说

pq.Enqueue(candidate, candidate.estimateDistance)

向队列添加元素时。

关于c# - C# 中的 PriorityQueue 不适用于自定义比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72680674/

相关文章:

c# - ADO.Net 实例失败

c# - 使用 XSD 架构的 Xml 验证

c++ - std::priority_queue 中具有相同优先级的元素的顺序

c# - List.Sort() by Comparison 的性能是否优于自定义 IComparer?

c# - vb.net 中的 IComparer 问题,但在 C# 中工作相同

c# - 无法在 Windows Server 2003 上读取印地语字体

c# - 如何使用 ExecuteScalar 从插入的行中获取生成的 ID?

c++ - 如何初始化一个以priority_queue为值的map与priority_queue的比较对象?

java - 优先队列中的元素何时排序?

c# - 在 CompareTo() 覆盖中有效禁用 Sort()?