2012-07-20 14 views
58

Questa può sembrare una cosa strana da voler ignorare, c'è un modo abbastanza conciso di convertire un elenco in dizionario in cui ogni coppia di valori chiave nel dizionario è solo ogni stringa nella lista. vale a direC# Converti lista <string> nel dizionario <string, string>

List = string1, string2, string3 
Dictionary = string1/string1, string2/string2, string3/string3 

ho fatto un sacco di ricerca e ci sono letteralmente decine di esempi su StackOverflow solo di farlo nella direzione opposta, ma non in questo modo rotondo.

Il motivo è che ho due componenti di terza parte e cambiarli è fuori dalle mie mani. Uno restituisce una lista di indirizzi e-mail come una lista e l'altra invia e-mail dove il parametro To è un dizionario. La chiave del dizionario è l'indirizzo email e il valore è il loro vero nome. Tuttavia, non conosco il vero nome ma funziona ancora se si imposta il vero nome anche all'indirizzo e-mail. Pertanto, perché voglio convertire una lista in un dizionario. Ci sono molti modi per farlo. Un ciclo foreach nella lista che aggiunge un kvp ad un dizionario. Ma mi piace il codice terse e mi chiedevo se esistesse una soluzione a linea singola.

+1

ho una soluzione migliore per il vostro motivo valido, onesto. – Will

+2

Si potrebbe voler vedere se HashSet <> soddisfa i propri requisiti, invece di usare Dizionario <,>. – Greg

+0

Più direttamente dei commentatori di cui sopra: se spieghi la tua ragione per volere questo, qualcuno può probabilmente suggerire una soluzione migliore. –

risposta

124

Prova questa:

var res = list.ToDictionary(x => x, x => x); 

La prima lambda permette di scegliere la chiave, la seconda raccoglie il valore.

Si può giocare con essa e rendere i valori differiscono dalle chiavi, come questo:

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x)); 

Se l'elenco contiene i duplicati, aggiungere Distinct() come questo:

var res = list.Distinct().ToDictionary(x => x, x => x); 

EDIT Per commentare sulla ragione valida, penso che l'unica ragione che potrebbe essere valida per conversioni come questa è che a un certo punto le chiavi e i valori nel dizionario risultante divergeranno. Ad esempio, si effettua una conversione iniziale e quindi si sostituiscono alcuni valori con qualcos'altro. Se le chiavi ei valori sono sempre sarà lo stesso, HashSet<String> fornirebbe una migliore misura per la vostra situazione:

var res = new HashSet<string>(list); 
if (res.Contains("string1")) ... 
+0

questo fallirà se l'elenco è come stringa1, stringa2, stringa3, stringa1 –

+3

@PranayRana Sì , sarebbe. È possibile aggiungere '.Distinct()' dopo 'list' per evitare questo. – dasblinkenlight

+0

Grazie. Ho perso la funzione ToDictionary. Grazie a tutti quelli che sostanzialmente hanno dato la stessa risposta. Ho upvoted tutti, ma posso solo accettare una risposta. Questo era solo uno con il codice Distinct aggiunto, quindi era il più completo a mio parere. – Jonnster

7

Utilizzare questa:

var dict = list.ToDictionary(x => x); 

Vedi MSDN per maggiori informazioni.

Come sottolineato da Pranay nei commenti, ciò non riuscirà se un elemento esiste nell'elenco più volte.
A seconda delle specifiche esigenze, è possibile utilizzare var dict = list.Distinct().ToDictionary(x => x); per ottenere un dizionario di elementi distinti oppure è possibile utilizzare ToLookup invece:

var dict = list.ToLookup(x => x); 

Questo restituirà un ILookup<string, string> che è essenzialmente lo stesso di IDictionary<string, IEnumerable<string>>, in modo da avere una lista di chiavi distinte con ogni istanza di stringa sotto di essa.

+0

questo fallirà se la lista è come string1, string2, string3, string1 –

+0

@PranayRana: hai ragione. Aggiustato. –

1

Utilizzando ToDictionary:

var dictionary = list.ToDictionary(s => s); 

Se è possibile che qualsiasi stringa potrebbe essere ripetuto, sia avviare una chiamata Distinct prima dell'elenco (per rimuovere i duplicati), oppure utilizzare ToLookup che consente più valori per chiave.

0

EDIT

un altro modo di trattare con duplicato è che si può fare in questo modo

var dic = slist.Select((element, index)=> new{element,index}) 
      .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element); 

o


modo semplice per farlo è

var res = list.ToDictionary(str => str, str=> str); 

ma fare in modo che non ci sia nessuna stringa si ripete ancora una volta ... otherewise sopra codice non funziona per voi

se c'è stringa è di ripetere che è meglio fare come questo

Dictionary<string,string> dic= new Dictionary<string,string>(); 

    foreach(string s in Stringlist) 
    { 
     if(!dic.ContainsKey(s)) 
     { 
     // dic.Add(value to dictionary 
     } 
    } 
-1

È possibile utilizzare:

var dictionary = myList.ToDictionary(x => x); 
Problemi correlati