Select a Dictionary with LINQ


I have used the "select" keyword and extension method to return an IEnumerable<T> with LINQ, but I have a need to return a generic Dictionary<T1, T2> and can't figure it out. The example I learned this from used something in a form similar to the following:

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

I've also done the same thing with extension methods. I assumed that since the items in a Dictionary<T1, T2> can be iterated as KeyValuePair<T1, T2> that I could just replace "SomeClass" in the above example with "new KeyValuePair<T1, T2> { ...", but that didn't work (Key and Value were marked as readonly, so I could not compile this code).

Is this possible, or do I need to do this in multiple steps?


3/6/2009 12:20:24 AM

Accepted Answer

The extensions methods also provide a ToDictionary extension. It is fairly simple to use, the general usage is passing a lambda selector for the key and getting the object as the value, but you can pass a lambda selector for both key and value.

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);

Then objectDictionary[1] Would contain the value "Hello"

3/6/2009 12:30:31 AM

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

That's assuming that SomeClass.prop1 is the desired Key for the dictionary.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow