2012-03-23 52 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