What is difference between Select and SelectMany in LINQ?

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("Using Select():\n");
		// 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("Using 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 :
Using Select():
C
C++
Java
SQL Server
C#
ASP.NET
C#
ASP.NET MVC
Windows Azure
SQL Server
Using SelectMany():
C
C++
Java
SQL Server
C#
ASP.NET
C#
ASP.NET MVC
Windows Azure
SQL Server */

 

Tagged , . Bookmark the permalink.

Leave a Reply