有人可以帮助我理解为什么这不起作用以及如何让它起作用吗?
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>)
,即TElement
是 Candidate
,和TPriority
是 int
,所以参数应该是 IComparer<int>
的实例,但是EstimateCompare
是 IComparer<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/