Contexto típico: Eu faço um método de extensão para uma coleção que considera que os elementos estão ordenados. A função começa no início, no índice 0, e a ordem tem significado. Exemplos: agrupando por sequência ou índices de um item .
No entanto, estou sempre perplexo quanto ao que estender: IEnumerable<T>
ou T[]
. Minha lógica era a clareza de propósito: uma matriz tem uma noção de ordenação, enquanto um IEnumerable é implementado por muitas coleções genéricas, nem todas com noção de ordem:
- Dicionário - não ordenado
- HashSet - não ordenado
- LinkedList - encomendado
- Lista - ordenada
- Fila - solicitada
- SortedDictionary - classificado (não na ordem original)
- SortedList - ordenada (não na ordem original)
- SortedSet - classificado (não na ordem original)
- Pilha - invertida
Bem como qualquer outra implementação que possa ou não ser solicitada.
Além disso, não tenho certeza se o enumerador é redefinido se uma enumeração não for concluída. Portanto, se isso for uma preocupação, quem sabe em que ponto a enumeração seria iniciada? Enumerar uma matriz sempre começaria no começo.
Então, para mim, faz mais sentido estender a T[]
. Mas estou correto ao pensar isso? Estou me preocupando demais? Qual é a abordagem adequada para garantir a enumeração "ordenada"?
Dictionary
? Provavelmente não. Como Scott Meyers disse: "A melhor maneira de impedir o uso incorreto é tornar esse uso impossível". . É possível / seria benéfico fazê-lo neste cenário?Eu acho que você deseja combinar 2 conceitos diferentes em 1. A estrutura de dados e sua ordem de conteúdo são duas coisas separadas.
Encomendar é um assunto complicado. Por exemplo, o que significa ordenar uma lista de pessoas? Mesmo quando a chave de ordem / classificação é definida, ela precisa ter uma direção e você precisa decidir o que fazer com nulos (se houver), problemas de data, etc.
Se a ordem dos dados for importante para o seu método, o método poderá ser responsável pela ordem dos dados como parte de sua configuração, em vez de solicitar que os dados sejam solicitados pelo chamador. Uma abordagem semelhante é usada por alguns algoritmos de correspondência de string, nos quais um dicionário é criado dentro do método de pesquisa a partir da string passada antes da pesquisa. Sei que esse não é o caso exato, mas é o exemplo mais próximo que pude pensar.
fonte
IEnumerable declara que a coleção que você possui pode ser enumerada; isso não implica nada sobre o conteúdo. Isso não é uma coisa ruim - os contêineres podem ter recursos e restrições adicionais sobre as interfaces individuais.
(Não vejo como uma matriz é melhor aqui - é indexável, como é um IList e outros contêineres, mas não há nada na indexação que implique ordem dos dados. Sua lista é meio estranha - alguns itens são "ordenados "na medida em que preservam a ordem de inserção, outras são" ordenadas ", assim como são classificadas. São duas coisas diferentes. Além do SortedSet / SortedList / SortedDictionary, você não deve assumir que os dados estão em uma ordem específica, a menos que você lide com isso. dentro do seu próprio código.)
No entanto, IEnumerable fornece uma extensão LINQ que permite .OrderBy, para que qualquer coisa enumerável possa ser retornada em uma ordem classificada IOrderedEnumerable. Porém, essa é uma interface específica para LINQ (e não implementada por padrão por SortedSet / SortedList / SortedDictionary, portanto, pode não fazer sentido estender essa interface específica ...)
fonte