Question

J'ai une implémentation de file d'attente prioritaire en C # que je veux ajouter une méthode .IndexOf à.

Cependant, étant donné que la file d'attente prioritaire ne se préoccupe pas vraiment avec l'ordre des valeurs elles-mêmes (qui est, si je devais simplement saisir toutes les valeurs, sans tenir compte de leurs priorités, ils auraient pas nécessairement un ordre du tout ), seule la priorité d'entre eux, je ne dispose pas de critères pour le type générique T de la file d'attente prioritaire, qui est, je ne précise pas qu'ils ont besoin d'avoir un peu d'ordre intrinsèque, ou comparabilité .

En tant que tel, quand je suis arrivé à mettre en œuvre .IndexOf(T value) j'ai un problème mineur.

Y at-il une norme dans quoi / comment je mettre en œuvre cela? Mes premières pensées était tout simplement d'utiliser EqualityComparer<T>.Default pour comprendre si j'ai trouvé le value ou non, mais il y a tellement de types similaires tels ces jours-ci.

Par exemple, voici ce que je suis venu avec pour couvrir ma base, mais cela semble exagéré:

  • public Int32 IndexOf(T value) (appels en interne l'un des autres avec 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)

Que faites-vous? Marquer cette fois comme subjective et wiki que cela est plus d'un sondage d'opinion que toute autre chose.

relisant ma propre question, je suppose que je peux utiliser celui sans comparateur, puis ajoutez la version sous-jacente, cette façon, l'utilisateur de cette classe peut appeler à peu près tout.

Notez également que je peux aussi faire pq[index] pour mettre la main sur un élément qui contient à la fois la priorité et la valeur elle-même, pour que je puisse aussi se débrouiller sans IndexOf du tout, mais je voudrais aussi avoir des méthodes qui dit < em> modifier la priorité de la valeur X à priorité P , ce qui nécessiterait une certaine forme de IndexOf / recherche interne. Et donc je voudrais aussi éviter d'avoir à faire de toutes les surcharges énièmes ces méthodes ainsi.


Réponse à un commentaire :. Oui, la file d'attente prioritaire est basée sur un tas

En fait, les deux classes sont définies comme suit:

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

PriorityQueueElement est une structure simple immuable avec des propriétés de priorités et des valeurs.

Réponse aux commentaires à venir : Étant donné que la file d'attente prioritaire est basée sur un tas, un « propriété intéressante » est que, en changeant la priorité d'une valeur par son indice signifie que par la suite, la valeur a gagné » t nécessairement être à cet indice. Je souhaite que cela comme documente dans certains cas, je prévois un besoin pour localiser indépendants / opérations de changement de priorité.

Était-ce utile?

La solution

Je voudrais faire la comparaison d'un paramètre constructeur en option; ce qui est comparable à la façon dont les choses comme Dictionary<,>, etc SortedList<,> vous permettent de spécifier le mécanisme de comparaison.

Que ce soit pour un IComparer<T> accepte ou un IEqualityComparer<T> dépend si vous allez trier les données, ou il suffit de regarder un match de l'égalité; si le match, alors vous aurez besoin de quelque chose comme IEqualityComparer<T>. Malheureusement, étant donné que cela a 2 méthodes (GetHashCode() et Equals()) il n'y a pas de version déléguée directe de ce fait, à l'exception peut-être Predicate<T> ou Func<T,T,bool>.

Pour le constructeur par défaut, je passe dans le [Equality]Comparer<T>.Default.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top