Qual é a maneira mais eficiente de criar um mapeamento constante (nunca muda em tempo de execução) de string
s para int
s?
Eu tentei usar um dicionário const , mas isso não deu certo.
Eu poderia implementar um invólucro imutável com semântica apropriada, mas isso ainda não parece totalmente correto.
Para aqueles que perguntaram, estou implementando IDataErrorInfo em uma classe gerada e estou procurando uma maneira de fazer a pesquisa columnName na minha matriz de descritores.
Eu não sabia (erro de digitação ao testar! D'oh!) Que o switch aceita strings, então é isso que eu vou usar. Obrigado!
c#
.net
collections
dictionary
constants
David Schmitt
fonte
fonte
Respostas:
Criar um dicionário constante gerado em tempo de compilação verdadeiramente em C # não é realmente uma tarefa simples. Na verdade, nenhuma das respostas aqui realmente consegue isso.
Existe uma solução que atende aos seus requisitos, embora não seja necessariamente uma boa; lembre-se de que, de acordo com a especificação C #, as tabelas de casos de comutação são compiladas em tabelas de salto de hash constantes. Ou seja, são dicionários constantes, não uma série de instruções if-else. Portanto, considere uma declaração de caso de troca como esta:
É exatamente isso que você deseja. E sim, eu sei, é feio.
fonte
Existem poucas coleções imutáveis na estrutura atual. Posso pensar em uma opção relativamente simples no .NET 3.5:
Uso
Enumerable.ToLookup()
- aLookup<,>
classe é imutável (mas com vários valores no rhs); você pode fazer issoDictionary<,>
facilmente:fonte
fonte
Essa é a coisa mais próxima que você pode obter de um "Dicionário CONST":
O compilador será inteligente o suficiente para criar o código o mais limpo possível.
fonte
Se estiver usando o 4.5+ Framework, eu usaria o ReadOnlyDictionary (também ReadOnly Collection para listas) para fazer mapeamentos / constantes somente leitura. É implementado da seguinte maneira.
fonte
private static readonly Dictionary<string, string> _yourDictionaryName = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "One",1 }, { "Two",2 }, { "Three",3 }, };
Foi assim que eu fiz.readonly Dictionary<TKey, TValue>
não é equivalente a aReadOnlyDictionary<TKey, TValue>
. De fato, a maneira como eles são "somente leitura" é praticamente o oposto um do outro. Veja: dotnetfiddle.net/v0l4aA .Por que não usar namespaces ou classes para aninhar seus valores? Pode ser imperfeito, mas é muito limpo.
Agora você pode acessar .ParentClass.FooDictionary.Key1, etc.
fonte
Não parece haver nenhuma interface imutável padrão para dicionários; portanto, criar um wrapper parece ser a única opção razoável, infelizmente.
Edit : Marc Gravell encontrou o ILookup que eu perdi - que permitirá pelo menos evitar a criação de um novo wrapper, embora você ainda precise transformar o Dicionário com .ToLookup ().
Se for uma necessidade restrita a um cenário específico, você poderá se beneficiar com uma interface mais orientada à lógica de negócios:
fonte
Não sei por que ninguém mencionou isso, mas em C # para coisas que não posso atribuir const, uso propriedades estáticas somente leitura.
Exemplo:
fonte
Apenas outra idéia, pois estou vinculando uma caixa de combinação winforms:
Para obter o valor int do nome de exibição de :
uso:
fonte
Por que não:
fonte