[英]PriorityQueue in C# doesn't work with custom comparer
Can someone help me understand why this doesn't work and how can make it work?有人可以帮我理解为什么这不起作用以及如何使它起作用吗?
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;
}
}
Here is the error I get:这是我得到的错误:
CS0535: 'EstimateCompare' does not implement interface member 'IComparer.Compare(int, int)' (in Solution.cs) CS0535:“EstimateCompare”未实现接口成员“IComparer.Compare(int, int)”(在 Solution.cs 中)
Tried using it like this and I get this error:尝试像这样使用它,我得到了这个错误:
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?'错误 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; } }
Many Thanks!!非常感谢!!
The constructor you're using is PriorityQueue<TElement, TPriority>(IComparer<TPriority>)
, that is, TElement
is Candidate
, and TPriority
is int
, so the argument should be an instance of IComparer<int>
, but EstimateCompare
is an IComparer<Candidate>
.您使用的构造函数是PriorityQueue<TElement, TPriority>(IComparer<TPriority>)
,即TElement
是Candidate
,而TPriority
是int
,所以参数应该是IComparer<int>
的实例,但EstimateCompare
是IComparer<Candidate>
.
So for example, the example compiles if you instead used因此,例如,如果您改为使用该示例编译
PriorityQueue<Candidate, Candidate> pq =
new PriorityQueue<Candidate, Candidate>(new EstimateCompare());
But given what your implementation of Compare
looks like, you probably don't want an IComparer
at all, and you could instead do with your PriorityQueue<Candidate, int>
and just use, say但是考虑到您的Compare
实现是什么样的,您可能根本不需要IComparer
,您可以改为使用PriorityQueue<Candidate, int>
并使用,比如说
pq.Enqueue(candidate, candidate.estimateDistance)
when adding elements to the queue.将元素添加到队列时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.