Select and SelectMany are projection operators. Select operator is used to select value from a collection and SelectMany operator is used to select values from a collection of collection i.e. nested collection.
Select operator produce one result value for every source value while SelectMany produce a single result that contains a concatenated value for every source value. Actually, SelectMany operator flatten IEnumerable<IEnumerable<T>> to IEnumrable<T> i.e. list of list to list.
- class Employee
- {
- public string Name { get; set; }
- public List<string> Skills { get; set; }
- }
- class Program
- {
- static void Main(string[] args)
- {
- List<Employee> employees = new List<Employee>();
- Employee emp1 = new Employee { Name = "Deepak", Skills = new List<string> { "C", "C++", "Java" } };
- Employee emp2 = new Employee { Name = "Karan", Skills = new List<string> { "SQL Server", "C#", "ASP.NET" } };
- Employee emp3 = new Employee { Name = "Lalit", Skills = new List<string> { "C#", "ASP.NET MVC", "Windows Azure", "SQL Server" } };
- employees.Add(emp1);
- employees.Add(emp2);
- employees.Add(emp3);
- // Query using Select()
- IEnumerable<List<String>> resultSelect = employees.Select(e=> e.Skills);
- Console.WriteLine("**************** Select ******************");
- // Two foreach loops are required to iterate through the results
- // because the query returns a collection of arrays.
- foreach (List<String> skillList in resultSelect)
- {
- foreach (string skill in skillList)
- {
- Console.WriteLine(skill);
- }
- Console.WriteLine();
- }
- // Query using SelectMany()
- IEnumerable<string> resultSelectMany = employees.SelectMany(emp => emp.Skills);
- Console.WriteLine("**************** SelectMany ******************");
- // Only one foreach loop is required to iterate through the results
- // since query returns a one-dimensional collection.
- foreach (string skill in resultSelectMany)
- {
- Console.WriteLine(skill);
- }
- Console.ReadKey();
- }
- }
- /* Output
- **************** Select ******************
- C
- C++
- Java
- SQL Server
- C#
- ASP.NET
- C#
- ASP.NET MVC
- Windows Azure
- SQL Server
- **************** SelectMany ******************
- C
- C++
- Java
- SQL Server
- C#
- ASP.NET
- C#
- ASP.NET MVC
- Windows Azure
- SQL Server
- */
What do you think?
I hope you will enjoy Select and SelectMany while programming with LINQ. I would like to have feedback from my blog readers. Your valuable feedback, question, or comments about this article are always welcome.