Domanda su overzelaous attuazione IndexOf
-
29-08-2019 - |
Domanda
Ho un implementazione coda di priorità in C # che voglio aggiungere un metodo .IndexOf a.
Tuttavia, dal momento che la coda di priorità non si riguarda in realtà con l'ordine dei valori stessi (vale a dire, se dovessi prendere solo tutti i valori, trascurando le loro priorità, che non sarebbe necessariamente un ordine a tutti ), solo la priorità di loro, non ho alcun criterio per il tipo generico T della coda di priorità, vale a dire, io non specificare che hanno bisogno di avere un po 'di ordine intrinseco, o comparabilità .
In quanto tale, quando sono venuto a implementare .IndexOf(T value)
Ho un problema minore.
C'è uno standard di cosa / come dovrei implementare questo? I miei pensieri iniziali era semplicemente quello di utilizzare EqualityComparer<T>.Default
per capire se ho trovato il value
o no, ma poi ci sono tanti simili tali tipi di questi giorni.
Per esempio, ecco cosa mi è venuta a coprire la mia base, ma questo sembra eccessivo:
-
public Int32 IndexOf(T value)
(chiama internamente uno degli altri conClassThatImplementsInterface.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)
Che cosa fate? Marcatura questo come sia soggettiva e wiki come questo è più di un sondaggio di opinione di ogni altra cosa.
On rileggendo la mia domanda credo che posso solo usare l'uno senza un operatore di confronto, e quindi aggiungere la versione predicato, in questo modo l'utente di questa classe può chiamare qualsiasi cosa.
Si noti inoltre che posso anche fare pq[index]
per entrare in possesso di un oggetto che contiene sia la priorità e il valore in sé, così ho potuto anche fare a meno IndexOf a tutti, ma mi piacerebbe anche avere metodi che dice < em> modificare la priorità del valore di X alla priorità P , che richiederebbe una qualche forma di IndexOf / ricerca internamente. E così mi piacerebbe anche per evitare di dover avere ennesime sovraccarichi di tutti questi metodi pure.
risposta al commento :. Sì, la coda di priorità si basa su un mucchio
In sostanza, le due classi sono definite in questo modo:
public class Heap<T> : IEnumerable<T>, ICloneable { ... }
public class PriorityQueue<T> : Heap<PriorityQueueElement<T>> { ... }
PriorityQueueElement è una semplice struttura immutabile, con priorità e valore proprietà.
La risposta al prossimo commento : Dal momento che la coda di priorità si basa su un mucchio, una "proprietà interessante" è che cambiando la priorità di un valore attraverso il suo indice significa che in seguito, il valore ha vinto' t necessariamente essere a tale indice. Intendo proprio documento Questo come in alcuni casi prevedo la necessità di operazioni di individuare / cambio di priorità indipendenti.
Soluzione
Vorrei fare il paragone di un parametro del costruttore facoltativo; questo è paragonabile a come le cose come Dictionary<,>
, SortedList<,>
ecc consentono di specificare il meccanismo di confronto.
Sia per accetta un IComparer<T>
o un IEqualityComparer<T>
dipende dal fatto che si sta per ordinare i dati, o semplicemente cercare una parità di corrispondenza; Se la partita, allora avrete bisogno di qualcosa di simile IEqualityComparer<T>
. Purtroppo, dal momento che questo ha 2 metodi (GetHashCode()
e Equals()
) non esiste una versione diretta delegato di questo, tranne forse Predicate<T>
o Func<T,T,bool>
.
Per il costruttore di default, mi piacerebbe passare nel [Equality]Comparer<T>.Default
.