Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ querying a Dictionary against a List

I have

List<string> selectedOptions;
Dictionary<string,string> masterList;

masterList comprises of Keys, which are the superset for the values in selectedoptions. Now, I would like to extract all the Values for the intersecting Keys between selectedOptions and masterList.

How would the LINQ query be framed?

like image 312
GilliVilla Avatar asked Aug 24 '12 17:08

GilliVilla


1 Answers

IEnumerable<KeyValuePair<string,string>> results = 
    dic.Join(keys, d => d.Key, x => x, (a, b) => a);

or of course

var results2 = keys.Select(k => new {key = k, value = dic[k]});

but this will bomb if keys don't exist.

you could fix this with a Where(k => dic.ContainsKey(k)) clause:

var results3 = keys
     .Where(k => dic.ContainsKey(k))
     .Select(k => new {key = k, value = dic[k]});

After trawling the Linq source, I think that the last method is probably most efficient. Doing a join forces linq to make a Lookup (effectively a multi-entry hashtable) over one of the collections involved in the join. Seeing as we already have a Dictionary which offers the same lookup performance as a Lookup, building a Lookup is superfluous.

like image 100
spender Avatar answered Sep 21 '22 15:09

spender