2012-03-23 73 views
13

我有一個像string strn = "abcdefghjiklmnopqrstuvwxyz"一個字符串,並希望有一個像字典:C#ToDictionary lambda選擇索引和元素?

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

我一直喜歡

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

的事情......但我已經得到了各種有關的錯誤委託不接受兩個參數,未指定的參數等。

我在做什麼錯?

我寧願提示回答,所以我有下一次需要做的事情的心理痕跡,但根據Stackoverflow的性質,答案也很好。

+0

你爲什麼它嘗試用linq做? var dict = new有什麼問題字典(); foreach(char c in strn)dict.Add(c,c-'a');' – 2012-03-23 23:15:16

+1

@ L.B,因爲我已經知道如何做到這一點。我想學習:D – mowwwalker 2012-03-23 23:16:27

+0

@ L.B我從庫中借用了C#4.0的深度,並通過它獲得了大約一半的內容,但是如果沒有練習,我沒有太多的內存,所以我停止閱讀。有了這個和最後一個問題,我在詢問之前看了網上的內容,而且我的確得出了相同或相似的結論,但是,作爲一名新程序員,我不願相信我的經驗和少數經驗谷歌結果我看到了與stackoverflow社區的聯合智慧。 – mowwwalker 2012-03-23 23:23:29

回答

22

使用.Select操作員首先:

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

我在做什麼錯?

你假設有這樣的過載。看看Enumerable.ToDictionary - 沒有提供索引的過載。您可以僞造它雖然通過調用Select

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

會這樣嗎?這不是'pair => pair [0]'嗎? – mowwwalker 2012-03-23 23:09:10

+2

@Walkerneo:是的,這有效。爲什麼會是'pair [0]'? 'pair'是對'Select'調用中創建的匿名內部類型實例的引用。 – 2012-03-23 23:10:04

+0

好吧,我測試了一下,它工作,但我仍然不能說我明白爲什麼。我不明白匿名對象如何具有屬性'value'和'index',它們也具有這兩個變量的值。它是'new {value = value,index = index}'的簡寫形式嗎? – mowwwalker 2012-03-23 23:13:41

1

你可以嘗試這樣的事:

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

字符串已經被指定爲IEnumerable 所以,不需要ToCharArray調用 – 2012-03-23 23:16:44