繁体   English   中英

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

[英]PriorityQueue in C# doesn't work with custom comparer

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

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”未实现接口成员“IComparer.Compare(int, int)”(在 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);
     }

错误 CS1503:参数 1:无法从“EstimateCompare”转换为“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)

将元素添加到队列时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM