top button
Flag Notify
    Connect to us
      Site Registration

Site Registration

Select VS SelectMany() in LINQ

+5 votes
289 views
Select VS SelectMany() in LINQ
posted Dec 24, 2014 by Merry

Share this question
Facebook Share Button Twitter Share Button LinkedIn Share Button

1 Answer

+2 votes
 
Best answer

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> to IEnumrable i.e. list of list to list.

Example:

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
*/
answer Dec 24, 2014 by Manikandan J
...