2012-03-23 12 views
13

Ho una stringa come string strn = "abcdefghjiklmnopqrstuvwxyz" e voglio un dizionario come:C# ToDictionary lambda select index and element?

Dictionary<char,int>(){ 
    {'a',0}, 
    {'b',1}, 
    {'c',2}, 
    ... 
} 

ho cercato le cose come

strn.ToDictionary((x,i) => x,(x,i)=>i); 

... ma sto ricevendo ogni sorta di errori circa la delegare non prendere due argomenti e argomenti non specificati e simili.

Cosa sto sbagliando?

Preferirei suggerimenti sulla risposta in modo da avere una traccia mentale di ciò che devo fare per la prossima volta, ma in base alla natura di Stackoverflow, una risposta va bene pure.

+0

Perché si prova a fare con linq? cosa c'è di sbagliato in 'var dict = new Dictionary (); foreach (char c in strn) dict.Add (c, c-'a '); ' –

+1

@ L.B, perché so già come farlo. Voglio imparare: D – mowwwalker

+0

@ L.B Ho preso in prestito il C# 4.0 in Depth dalla libreria, e ne ho ricavato circa a metà, ma non mi stavo dedicando molto alla memoria senza aver praticato, quindi ho smesso di leggere. Con questa e l'ultima domanda, ho cercato online prima di chiedere, e ho raggiunto conclusioni identiche o simili a quelle fornite, ma, come nuovo programmatore, sono riluttante a credere a quella piccola esperienza che ho e ai pochi risultati di Google che ho visto contro la saggezza combinata della community StackOverflow. – mowwwalker

risposta

22

Utilizzare l'operatore .Select prima:

strn 
    .Select((x, i) => new { Item = x, Index = i }) 
    .ToDictionary(x => x.Item, x => x.Index); 
6

Cosa sto sbagliando?

Si presume che lo sia tale sovraccarico. Guarda Enumerable.ToDictionary - non c'è sovraccarico che fornisce l'indice. Si può fingere se tramite una chiamata a Select:

var dictionary = text.Select((value, index) => new { value, index }) 
        .ToDictionary(pair => pair.value, 
            pair => pair.index); 
+0

Potrebbe funzionare? Non sarebbe 'pair => pair [0]'? – mowwwalker

+2

@Walkerneo: Sì, funziona. Perché dovrebbe essere 'pair [0]'? 'pair' è un riferimento a un'istanza del tipo interno anonimo creato nella chiamata' Select'. –

+0

Va bene, l'ho provato e ha funzionato, ma non posso ancora dire di aver capito perché. Non capisco come l'oggetto anonimo abbia proprietà 'value' e' index' che hanno anche i valori di queste due variabili. È una scorciatoia per 'new {value = value, index = index}'? – mowwwalker

1

si potrebbe provare qualcosa di simile:

string strn = "abcdefghjiklmnopqrstuvwxyz"; 

Dictionary<char,int> lookup = strn.ToCharArray() 
    .Select((c, i) => new KeyValuePair<char,int>(c, i)) 
     .ToDictionary(e => e.Key, e => e.Value); 
+1

stringa già tesa come IEnumerable quindi, non è necessario chiamare ToCharArray –