[英]C# Comparer.Default<short>.Compare and Comparer.Default<byte> doesn't return -1, 0 or 1
[英]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>)
,即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)
将元素添加到队列时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.