簡體   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