1

.IndexOf メソッドを追加したい C# のプライオリティ キューの実装があります。

ただし、プライオリティ キューは値自体の順序に実際には関与しないため (つまり、優先順位を無視してすべての値を取得した場合、それらは必ずしも順序を持つとは限りません)。それらの優先度、優先度キューのジェネリック型 T の基準はありません。つまり、組み込みの順序または比較可能性が必要であるとは指定していません。

そのため、実装するようになったとき.IndexOf(T value)、小さな問題があります。

これを何/どのように実装する必要があるかについての標準はありますか? 私の最初の考えはEqualityComparer<T>.Default、見つけたvalueかどうかを把握するために使用するだけでしたが、最近では同様のタイプが非常に多くあります。

たとえば、これは私の基礎をカバーするために思いついたものですが、これはやり過ぎのようです:

  • public Int32 IndexOf(T value)(内部的に他の 1 つを で呼び出しますClassThatImplementsInterface.Default)
  • public Int32 IndexOf(T value, IComparer<T> comparer)
  • public Int32 IndexOf(T value, IEqualityComparer<T> comparer)
  • public Int32 IndexOf(T value, IEquatable<T> comparer)
  • public Int32 IndexOf(T value, Predicate<T> predicate)

職業はなんですか?これは何よりも世論調査であるため、これを主観的かつウィキとしてマークします。

自分の質問を読み直すと、比較子のないものを使用して、述語バージョンを追加できると思います。このようにして、このクラスのユーザーはほぼ何でも呼び出すことができます。

またpq[index]、優先度と値自体の両方を含むアイテムを取得することもできるため、IndexOf をまったく使用しなくても済むこともありますが、値の優先度を変更するメソッドも必要です。 X を優先度 Pに変更すると、何らかの形式の IndexOf/search が内部的に必要になります。したがって、これらすべてのメソッドの多数のオーバーロードも回避したいと思います。


コメントへの対応: はい、優先キューはヒープに基づいています。

基本的に、2 つのクラスは次のように定義されます。

public class Heap<T> : IEnumerable<T>, ICloneable { ... }
public class PriorityQueue<T> : Heap<PriorityQueueElement<T>> { ... }

PriorityQueueElement は、Priority プロパティと Value プロパティを持つ単純な不変構造です。

今後のコメントへの対応: 優先度キューはヒープに基づいているため、"興味深い特性" は、インデックスを介して値の優先度を変更することによって、その後、値が必ずしもそのインデックスにあるとは限らないことを意味します。場合によっては、独立した位置特定/優先度変更操作の必要性が予測されるため、これを文書化するつもりです。

4

1 に答える 1

2

比較をオプションのコンストラクター パラメーターにします。これはDictionary<,>SortedList<,>などで比較メカニズムを指定できるようにする方法に匹敵します。

IComparer<T>anまたは anを受け入れるかどうかはIEqualityComparer<T>、データを並べ替えるか、単に等値一致を探すかによって異なります。一致する場合は、次のようなものが必要になりますIEqualityComparer<T>。残念ながら、これには 2 つのメソッド ( GetHashCode()and ) があるため、おそらくorEquals()を除いて、これの直接のデリゲート バージョンはありません。Predicate<T>Func<T,T,bool>

デフォルトのコンストラクターには、[Equality]Comparer<T>.Default.

于 2008-12-29T10:08:47.480 に答える