Reputation: 17
I have the below dictionary
Dictionary<string,string> q1=new Dictionary<string,string>
{
{"h1","name1"},{"h2","name2"}
};
Dictionary<string,string> q2=new Dictionary<string,string>
{
{"h1","name12"},{"h2","name23"}
};
Dictionary<string,string> q3=new Dictionary<string,string>
{
{"h1","name123"},{"h2","name234"}
};
List<Dictionary<string,string>> m1 = new List<Dictionary<string,string>> { q1,q2,q3 };
Dictionary<string, List<Dictionary<string,string>>> mhi = new Dictionary<string, List<Dictionary<string,string>>>();
mhi.Add("x1", m1);
I need to return a list which has the values name1,name12,name123 using linq. I am aware of normal method which works for me. But I am curious to know how to implement this using linq
Upvotes: 0
Views: 996
Reputation: 3796
Try this:
var q1 = new Dictionary<string, string> {
{"h1", "name1"},
{"h2", "name2"}
};
var q2 = new Dictionary<string, string> {
{"h1", "name12"},
{"h2", "name23"}
};
var q3 = new Dictionary<string, string> {
{"h1", "name123"},
{"h2", "name234"}
};
var m1 = new List<Dictionary<string, string>> { q1, q2, q3 };
//Using LINQ
List<string> result = (from dictionary in m1
from keyValuePair in dictionary
where keyValuePair.Key == "h1"
select keyValuePair.Value).ToList();
//result = name1,name12,name123
//without linq
var result2 = new List<string>();
foreach(var dictionary in m1)
foreach(var keyValuePair in dictionary)
if(keyValuePair.Key == "h1")
result2.Add(keyValuePair.Value);
Edit:
The from
clause specifies the data source, the where
clause applies the filter, and the select
clause projects each element of the sequence into a new form.
Linq queries are not executed until we iterate through it. (Here .ToList()
is doing that). It's like a blueprint which specifies how the information is returned when executed(iterated).
Lets examine each statement separately:
from dictionary in m1
- This is much like foreach(var dictionary in m
) except that it doesn't iterate (Because its a blueprint). It specifies which source we are iterating through (m1
) and the variable to assign to each member (dictionary
that is. We know that it will be of type Dictionary<String, String>
)from keyValuePair in dictionary
- Here we use the dictionary
variable created from the previous statement. The type of keyValuePair
will be KeyValuePair<string,string>
because we will be "iterating" through a Dictionary<string,string>
when the query is executed.where keyvaluePair.Key == "h1"
- This filters out the keyValuePairs from the previous statement whose Key
property equals "h1". KeyValuePair
s, we can select
their Value
property. This "projects" the filtered out KeyValuePair
sequence to the new type IEnumerable<string>
ToList
method executes the query to get the results.Upvotes: 1