使用LINQ </t1,>选择字典<t1,t2 =“”>

时间:2009-03-06 00:20:24

标签: c# .net linq generics

我使用“select”关键字和扩展方法返回带有LINQ的IEnumerable<T>,但是我需要返回一个通用Dictionary<T1, T2>并且无法解决它。我通过使用类似于以下形式的东西来学习这个例子:

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被标记为readonly,因此我无法编译此代码。)

这是可能的,还是我需要分多步完成?

感谢。

3 个答案:

答案 0 :(得分:245)

扩展方法还提供ToDictionary扩展名。它使用起来相当简单,一般用法是为键传递lambda选择器并将对象作为值,但是你可以为键和值传递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]将包含值“Hello”

答案 1 :(得分:40)

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

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

答案 2 :(得分:20)

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

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