![](/img/trans.png)
[英]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.