2012-07-06 2 views
6

Sto lavorando su un Kata sul mio pranzo e ho scollarsi ...LINQ - trasformare Lista <string> in Dictionary <string, string>

Ecco i passi che sto cercando di seguire:

  • Dato uno stringa di input, dividere la stringa dalla nuova linea carattere
  • Visto il risultato matrice di stringhe della fase precedente, saltare il primo elemento dell'array
  • Data la raccolta di stringhe risultanti dalla precedente passo, crea una collezione composta da ogni 2 e ELEMENTI

In quest'ultima affermazione quello che voglio dire è, dato questa raccolta di 4 stringhe:

{ 
    "string1", 
    "string2", 
    "string3", 
    "string4" 
} 

dovrei finire con questa collezione di coppie (è 'tuple' il termine giusto?):

{ 
    { "string1","string2" }, 
    { "string3","string4" } 
} 

ho iniziato a guardare ToDictionary, poi spostati verso la selezione di un tipo anonimo, ma non sono sicuro come dire "ritorno i prossimi due stringhe come coppia".

Il mio codice è simile a questo, al momento della scrittura:

public void myMethod() { 

    var splitInputString = input.Split('\n'); 

    var dic = splitInputString.Skip(1).Select(/* each two elements */); 
} 

Applausi per l'aiuto!

James

risposta

4

Beh, si potrebbe usare (non testata):

var dic = splitInputStream.Zip(splitInputStream.Skip(1), 
           (key, value) => new { key, value }) 
          .Where((pair, index) => index % 2 == 0) 
          .ToDictionary(pair => pair.key, pair => pair.value); 

La parte Zip si concluderà con:

{ "string1", "string2" } 
{ "string2", "string3" } 
{ "string3", "string4" } 

... e la coppia di Where utilizzando l'indice salterà ogni altra voce (che sarebbe "valore con la chiave successiva").

Naturalmente se davvero sai che hai un List<string> per cominciare, si può solo accedere alle coppie in base all'indice, ma questo è noioso ...

+0

Esattamente quello che cercavo! Non ero a conoscenza di Zip - grazie per quello. –