使用LINQ选择字典<T1,T2>


171

我已经使用“ select”关键字和扩展方法来返回IEnumerable<T>LINQ,但是我需要返回一个泛型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> { ...”,但这没有用(键和值被标记为只读,因此我无法编译此代码)。

这可能吗,还是我需要分多个步骤进行?

谢谢。

Answers:


284

扩展方法还提供了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”


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

假设这SomeClass.prop1Key字典所需要的。


27
.ToDictionary(item => item.prop1, item => item.prop2);明确设置值。
finoutlook 2011年

41

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

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

是否可以删除.ToDictionary(x => x.Key,x => x.Value); 并用新的Dictionary替换新的KeyValuePair?
阿米尔族第

@ AmirNo-Family您误会了。Select(x => x ...)方法为对象集合的每个元素执行投影。因此,用新的字典替换新的KeyValuePair将创建字典。我认为这不是您的目标。
Antoine Meltzheim

我有一个Dictionary <string,string>的列表,并试图在它们上使用select,但是它会引发编译错误。
阿米尔族
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.