Pergunta

Eu tenho uma lista de valores de cadeia que eu quero adicionar a uma tabela hash ou outra matriz que pode ser acessado por chave / índice, mas não pode implementá-lo. Eu tenho esse trabalho como eu quero, mas a sua feia

        List<string> valueList = new List<string>();
        valueList.Add("1");
        valueList.Add("2");
        valueList.Add("3");

        Hashtable p = new Hashtable();


        valueList.ForEach(delegate(string f) { p.Add(valueList.FindIndex(v => v == f), f); });

EDIT: Depois de James lembrou-me que a lista irá retornar valores pelo índice Fui com uma lista e é isso que eu acabei com

valueList.ForEach(f => sequenceList.Add(int.Parse(f)));
Foi útil?

Solução

Tente isto:

valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x));

Embora, não há realmente nenhuma razão não para usar um for aqui

for (var index = 0; index < valueList.Count; index++)
{
    htable.Add(index, valueList[index]);
}

É mais linhas de código, mas é mais simples e terá um desempenho muito melhor (FindIndex é muito menos eficiente do que usando o index da instrução for).

Outras dicas

Mesmo que compilado, ele não iria funcionar -. Chamando GetEnumerator().Current sempre falhará porque ele vai dar-lhe um new iterador posicionado antes do primeiro item

O que você quer a chave para cada item a ser? Se é só a sua posição dentro da lista, eu não vejo o benefício que lhe dá mais de uma lista (que já está indexado por int). No entanto, você pode fazê-lo como este (supondo que valueList é um List<string>:

var dictionary = valueList.Select((item, index) => new { item, index })
                          .ToDictionary(x => x.index, x => x.item);

Adicionando-lo para um dicionário existente, eu tinha acabado de fazer:

for (int i=0; i < valueList.Count; i++)
{
    dictionary[i] = valueList[i];
}

Não tudo tem de ser feito com lambdas:)

Note que este não terá exatamente o mesmo efeito que usar FindIndex se tiver repetido valores.

Assumindo que você quer as cordas a ser as chaves e o índice para ser o valor:

Hashtable ht = new Hashtable();

for (var i = 0; i <= valueList.Count; i++)
{
    ht.Add(valueList[i], i);
}

mudar Caso contrário, os parâmetros ht.Add redor. No entanto, se esse for o caso, você seria melhor apenas para deixá-lo como um List .

List<string> list = new List<string>{"w", "y", "u", "i", "n"};

HashSet<string> hset = new HashSet<string>(list);

Usando ForEach para isso não é eficiente, como você tem que usar FindIndex para descobrir onde você está. Ele funciona, mas você vai fazer um monte de trabalho extra:

valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x));

É melhor usar apenas um ciclo regular, para que você obtenha o índice sem ter que procurar através da tabela:

for (int i = 0; i < valueList.Count; i++) {
   htable.Add(i, valueList[i]);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top