2009-03-06 45 views
138

我已经使用“select”关键字和扩展方法返回一个带有LINQ的IEnumerable<T>,但我需要返回一个通用的Dictionary<T1, T2>,但无法弄清楚。我从以下类似的东西中学到了这个例子:选择字典<T1, T2> with LINQ

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 }; 

我也对扩展方法做了同样的事情。我认为,因为Dictionary<T1, T2>中的项可以迭代为KeyValuePair<T1, T2>,所以我可以用上述示例中的“SomeClass”替换为“new KeyValuePair<T1, T2> { ...”,但这样做不起作用(Key和Value被标记为只读,所以我不能编译这段代码)。

这是可能的,还是我需要在多个步骤中做到这一点?

谢谢。

回答

221

该扩展方法还提供了一个ToDictionary扩展名。它的使用相当简单,一般用法是为键传递一个lambda选择器并将该对象作为值,但是您可以为key和value传递一个lambda选择器。

class SomeObject 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

SomeObject[] objects = new SomeObject[] 
{ 
    new SomeObject { ID = 1, Name = "Hello" }, 
    new SomeObject { ID = 2, Name = "World" } 
}; 

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name); 

然后objectDictionary[1]将包含值 “你好”

+3

+1 Whuh。这为我创建新数据对象的方式开辟了新的可能性。 – Sung 2009-03-06 01:12:46

+1

太棒了,很高兴你能够使用它,我知道它在某些情况下帮助了我。 – 2009-03-06 01:28:40

34
var dictionary = (from x in y 
        select new SomeClass 
        { 
         prop1 = value1, 
         prop2 = value2 
        } 
       ).ToDictionary(item => item.prop1); 

这是假设SomeClass.prop1是字典所需Key

11

KeyValuePair的集合更加明确,并且执行得非常好。

Dictionary<int, string> dictionary = objects 
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name)) 
    .ToDictionary(x=>x.Key, x=>x.Value); 
相关问题