Meena
Meena

Reputation: 715

How to get a values list from a dictionary where the key matches in a list in c#

I have a dictionary and I want to retrieve all the values list from the dictionary based on a condition on the key, i.e. I want to retrieve only the values for which the respective key matches in alist.

Example: dictionary is as follows

IDictionary<string, string> maskingValues = new Dictionary<string, string>();
maskingValues.Add("cat", "Me@ena");
maskingValues.Add("dog", "N&avya");
maskingValues.Add("llama", "vivek!a");
maskingValues.Add("iguana", "sh^ams");

and I have list of strings as

List<string> keysString = new List<string>();
keysString.Add("cat");
keysString.Add("fox");

Now my requirement is to get the values list from the dictionary where the key matches from the keysString list.

The output should be

Me@ena

till now what I have done is

var all_parameters = maskingValues .Keys.ToList();

var parameters_to_mask = all_parameters.Intersect(keysString);

var values_list = parameters_to_mask.Where(k => data_dictionary.ContainsKey(k)).Select(k => data_dictionary[k]);

so values_list will contain the output Me@ena, I retrieved all the keys from the dictionary and then compared the keys list with the keysString list and then retrieved the values list from the output of the two list's intersect. But can I do it in more optimized way so that the code and the performance is good.

Thanks in advance. Please help me out.

Upvotes: 3

Views: 5336

Answers (6)

Jayesh Patel
Jayesh Patel

Reputation: 311

This Should Work:

Below Solution is used when you know your Key name and want to retrive value of key

string objectValue;
maskingValues.TryGetValue("cat", out objectValue);

If you want to Retrive All values from Dictionary than used single line of code: maskingValues.Values

Upvotes: -1

Sadique
Sadique

Reputation: 22823

This should work:

var q = maskingValues.Where(x => keysString.Contains(x.Key)).Select(x => x.Value);
foreach (var item in q)
{
    Console.WriteLine(item);
}

Upvotes: 5

Johan Larsson
Johan Larsson

Reputation: 17580

Not sure I got the spec right but this is faster than linq:

var matches = new List<string>();
foreach (var key in keysString)
{
    if (maskingValues.TryGetValue(key, out string value))
    {
        matches.Add(value);
    }
}

Upvotes: 1

to StackOverflow
to StackOverflow

Reputation: 124696

If your dictionary is large, you can improve performance by taking advantage of the fact that accessing an element by key in a dictionary is O(

var result = keysString
    .Select(k => 
          { string value; 
            maskingValues.TryGetValue(k, out value); 
            return value; 
          })
    .Where(v => v != null);

... etc ...

Note that using TryGetValue is more efficient than calling Contains then the dictionary indexer.

Upvotes: 0

Pikoh
Pikoh

Reputation: 7703

There are a lot of solutions. This one for example:

var newlist = maskingValues.Where(x => keysString.Contains(x.Key)).Select(y=>y.Value).ToList();

Upvotes: 3

Sasha
Sasha

Reputation: 1724

I came up with a quick bit of code to do this fully using linq.

keysString.Where(x => maskingValues.Keys.Contains(x)).ToList().ForEach(x => Console.WriteLine(maskingValues[x]));

Upvotes: 1

Related Questions