Pergunta

Eu preciso armazenar uma tabela de pesquisa como um membro de instância em uma das minhas classes. A tabela serão inicializados quando o objecto é construído. Cada "linha" terá 3 "colunas":

StringKey (e.g., "car")
EnumKey (e.g., LookupKeys.Car)
Value (e.g, "Ths is a car.")

Eu quero pegar a estrutura de dados que irá produzir o melhor desempenho para fazer pesquisas, quer pela StringKey ou o EnumKey.

É meio estranho ter 2 chaves para o mesmo valor dicionário. Eu nunca encontrou isso antes, então eu estou querendo saber qual a norma é para este tipo de coisa.

Eu poderia fazer uma estrutura de chave / valor / valor em vez de Key / Key / Value, mas eu estou querendo saber que tipo de impacto no desempenho que teria.

Am I pensamento sobre esta tudo errado?

Foi útil?

Solução

Você tem duas HashMaps.

  • Um dos StringKey de valor.

  • Um dos EnumKey de valor.

Você não tem que duplicar todas as instâncias do valor, os objetos podem ser compartilhados entre os dois HashMaps.

Se é um monte de itens, você pode querer usar dois Treemaps em vez de dois HashMaps. Mas o princípio essencial ( "partilhar os valores") se aplica a ambas as estruturas. Um conjunto de valores com dois mapas.

Outras dicas

Bem ... "Errado" é uma maneira dura de colocá-lo. Eu acho que porque o dicionário mais comum é a "chave única para o valor", e um monte de esforço vai para fornecimento de estruturas de dados eficientes para que (mapas), muitas vezes é melhor usar apenas dois deles, compartilhando a memória para os valores se possível.

É realmente necessário para chave na mesma estrutura com ambos os tipos de chave? Você provavelmente não precisará reconstruir uma estrutura de dados complexa si mesmo. Você poderia fazer algum tipo de encapsulamento para a tabela de referência de modo que você realmente tem duas tabelas de pesquisa, se a memória não é um problema. Você poderia usar esta estrutura encapsular para simular ser capaz de retirar o valor do "mesmo" estrutura com qualquer tipo de chave.

ou

Se há alguma maneira de mapear entre o valor enum ea chave seqüência que você pode ir por esse caminho com ter apenas um tipo de tabela de pesquisa.

O LINQ iLookup (TKey, TElement) interface pode ajudar. Assumindo que o seu dicionário é algo como:

Dictionary<carKey, carValue> cars;

Você pode usar:

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key);

(... na verdade eu acho que eu poderia ter um pouco descaracterizou a pergunta -., Mas uma iLookup ainda pode caber a conta, mas o conjunto de chave / valor pode precisar ser a chave eo enum)

Se cada valor é garantido para ser acessível por ambos os tipos de chaves, uma outra idéia seria a de converter um tipo de chave para outro. Por exemplo:

public Value getValue(String key)
{
    dictionary.get(key); // normal way
}

public Value getValue(Enum enumKey)
{
    String realKey = toKey(enumKey);
    getValue(realKey); // use String key
}

Você pode ter o seu Enum implementar um método Tokey () que retorna sua chave String, ou talvez ter outro dicionário que mapeia valores enum para os homólogos de corda.

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