Pode parecer uma coisa estranha de se querer, mas, ignorando isso, existe uma maneira concisa e agradável de converter uma Lista em Dicionário, onde cada Par de Valores-Chave no Dicionário é apenas cada string na Lista. ie
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
Eu fiz muitas pesquisas e existem literalmente dezenas de exemplos no Stackoverflow sozinho de fazer isso na direção oposta, mas não desta forma.
A razão para fazer isso é que eu tenho dois componentes de terceiros e alterá-los está fora de minhas mãos. Um retorna uma lista de endereços de e-mail como uma Lista e o outro envia e-mails onde o parâmetro Para é um Dicionário. A chave do dicionário é o endereço de e-mail e o valor é o nome real. No entanto, não sei o nome real, mas ainda funciona se você definir o nome real como o endereço de e-mail também. Portanto, por que quero converter uma lista em um dicionário. Existem muitas maneiras de fazer isso. Um loop foreach na lista que adiciona um kvp a um dicionário. Mas eu gosto de código conciso e me pergunto se existe uma solução de uma única linha.
fonte
Respostas:
Experimente isto:
O primeiro lambda permite que você escolha a chave, o segundo escolhe o valor.
Você pode brincar com ele e fazer com que os valores sejam diferentes das chaves, assim:
Se a sua lista contém duplicatas, adicione
Distinct()
assim:EDITAR Para comentar sobre o motivo válido, acho que o único motivo que poderia ser válido para conversões como essa é que em algum ponto as chaves e os valores no dicionário resultante irão divergir. Por exemplo, você faria uma conversão inicial e, em seguida, substituiria alguns dos valores por outra coisa. Se as chaves e os valores forem sempre os mesmos,
HashSet<String>
seria um ajuste muito melhor para sua situação:fonte
.Distinct()
depoislist
para evitar isso.Usa isto:
Consulte MSDN para obter mais informações.
Como Pranay aponta nos comentários, isso falhará se um item existir na lista várias vezes.
Dependendo de seus requisitos específicos, você pode usar
var dict = list.Distinct().ToDictionary(x => x);
para obter um dicionário de itens distintos ou pode usarToLookup
:Isso retornará um
ILookup<string, string>
que é essencialmente o mesmo queIDictionary<string, IEnumerable<string>>
, portanto, você terá uma lista de chaves distintas com cada instância de string abaixo dela.fonte
Usando
ToDictionary
:Se for possível que qualquer string possa ser repetida, faça uma
Distinct
chamada primeiro na lista (para remover duplicatas) ou use oToLookup
que permite vários valores por chave.fonte
Você pode usar:
fonte
EDITAR
outra maneira de lidar com duplicatas é fazer assim
ou
maneira fácil de fazer é
mas certifique-se de que nenhuma string está se repetindo ... novamente, caso contrário, o código acima não funcionará para você
se houver string repetindo, então é melhor fazer assim
fonte