Pergunta sobre a implementação overzelaous de IndexOf
-
29-08-2019 - |
Pergunta
Eu tenho uma implementação de fila de prioridade em C # que eu quero adicionar um método .IndexOf a.
No entanto, desde a fila de prioridade realmente não preocupar-se com a ordem dos valores de si mesmos (isto é, se eu fosse simplesmente pegar todos os valores, desconsiderando suas prioridades, eles não têm necessariamente qualquer ordem em tudo ), apenas a prioridade deles, eu não tenho quaisquer critérios para o tipo genérico T da fila de prioridade, ou seja, eu não especificar que eles precisam ter um pouco de ordem intrínseca, ou comparabilidade .
Como tal, quando vim para implementar .IndexOf(T value)
Eu tenho um problema menor.
Existe um padrão em que / como eu deveria implementar isso? Meus pensamentos iniciais foi simplesmente para uso EqualityComparer<T>.Default
a figura se eu ter encontrado o value
ou não, mas, em seguida, há assim muitos desses tipos semelhantes nestes dias.
Por exemplo, aqui está o que eu vim com para cobrir a minha base, mas isso parece um exagero:
-
public Int32 IndexOf(T value)
(internamente chama um dos outros comClassThatImplementsInterface.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)
O que você faz? Marcando isso como subjetiva e wiki como esta é mais uma pesquisa de opinião que qualquer outra coisa.
Na re-ler a minha própria pergunta eu acho que pode apenas usar um sem um comparador, e em seguida, adicione a versão predicado, desta forma o usuário desta classe pode chamar qualquer coisa.
Além disso, note que eu também pode fazer pq[index]
para se apossar de um item que contém tanto a prioridade eo próprio valor, então eu também poderia passar sem IndexOf em tudo, mas eu também gostaria de ter métodos que diz < em> mudar a prioridade do valor de X com a prioridade P , que seria necessário algum tipo de IndexOf / search internamente. E assim eu também gostaria de evitar ter que ter sobrecargas enésima de todos estes métodos também.
Resposta ao comentário :. Sim, a fila de prioridade é baseado em uma pilha
Basicamente, as duas classes são definidas assim:
public class Heap<T> : IEnumerable<T>, ICloneable { ... }
public class PriorityQueue<T> : Heap<PriorityQueueElement<T>> { ... }
PriorityQueueElement é uma estrutura imutável simples com prioridade e Valor propriedades.
Resposta a próxima comentário : Desde a fila de prioridade é baseado em uma pilha, uma "propriedade interessante" é que, alterando a prioridade de um valor através de seus meios de índice que mais tarde, o valor won' t, necessariamente, de ser no que índice. Pretendo apenas documentar isso como em alguns casos eu prevejo uma necessidade de independente localizar operações / mudança de prioridade.
Solução
Gostaria de fazer a comparação de um parâmetro de construtor opcional; Isto é comparável a como as coisas como Dictionary<,>
, SortedList<,>
etc permitem que você especifique o mecanismo de comparação.
Se a aceita um IComparer<T>
ou um IEqualityComparer<T>
depende se você está indo para classificar os dados, ou apenas olhar para um jogo igualdade; se o jogo, então você precisa de algo como IEqualityComparer<T>
. Infelizmente, uma vez que este tem 2 métodos (GetHashCode()
e Equals()
) não existe uma versão direta desse delegado, exceto talvez Predicate<T>
ou Func<T,T,bool>
.
Para o construtor padrão, que eu passaria no [Equality]Comparer<T>.Default
.