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 com 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)

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top