Use List ForEach para adicionar elemento para HashTable
-
23-08-2019 - |
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)));
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]);
}