The SelectMany() method is used to flatten a sequence in which each of the elements of the sequence is a separate.
I have class user same like this
class User { public string UserName { get; set; } public List<string> Roles { get; set; } }
main:
var users = new List<User> { new User { UserName = "Reza" , Roles = new List<string>{"Superadmin" } }, new User { UserName = "Amin" , Roles = new List<string>{"Guest","Reseption" } }, new User { UserName = "Nima" , Roles = new List<string>{"Nurse","Guest" } }, }; var query = users.SelectMany(user => user.Roles, (user, role) => new { user.UserName, role }); foreach (var obj in query) { Console.WriteLine(obj); } //output //{ UserName = Reza, role = Superadmin } //{ UserName = Amin, role = Guest } //{ UserName = Amin, role = Reseption } //{ UserName = Nima, role = Nurse } //{ UserName = Nima, role = Guest }
You can use operations on any item of sequence
int[][] numbers = { new[] {1, 2, 3}, new[] {4}, new[] {5, 6 , 6 , 2 , 7, 8}, new[] {12, 14} }; IEnumerable<int> result = numbers .SelectMany(array => array.Distinct()) .OrderBy(x => x); //output //{ 1, 2 , 2 , 3, 4, 5, 6, 7, 8, 12, 14 }
List<List<int>> numbers = new List<List<int>> { new List<int> {1, 2, 3}, new List<int> {12}, new List<int> {5, 6, 5, 7}, new List<int> {10, 10, 10, 12} }; IEnumerable<int> result = numbers .SelectMany(list => list) .Distinct() .OrderBy(x=>x); //output // { 1, 2, 3, 5, 6, 7, 10, 12 }
SelectFromManywould be a much more descriptive name thanSelectMany?