public class PhoneNumber{public string Number { get; set; }}
public class Person{public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }public string Name { get; set; }}
IEnumerable<Person> people = new List<Person>();
// Select gets a list of lists of phone numbersIEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);
// SelectMany flattens it to just a list of phone numbers.IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);
// And to include data from the parent in the result:// pass an expression to the second parameter (resultSelector) in the overload:var directory = people.SelectMany(p => p.PhoneNumbers,(parent, child) => new { parent.Name, child.Number });
var teamsAndTheirLeagues =from helper in leagues.SelectMany( l => l.Teams, ( league, team ) => new { league, team } )where helper.team.Players.Count > 2&& helper.league.Teams.Count < 10select new{ LeagueID = helper.league.ID, Team = helper.team};
List<string> animals = new List<string>() { "cat", "dog", "donkey" };List<int> number = new List<int>() { 10, 20 };
var mix = number.SelectMany(num => animals, (n, a) => new { n, a });
var players = db.SoccerTeams.Where(c => c.Country == "Spain").SelectMany(c => c.players);
foreach(var player in players){Console.WriteLine(player.LastName);}
class Program{static void Main(string[] args){List<Order> orders = new List<Order>{new Order{OrderID = "orderID1",OrderLines = new List<OrderLine>{new OrderLine{ProductSKU = "SKU1",Quantity = 1},new OrderLine{ProductSKU = "SKU2",Quantity = 2},new OrderLine{ProductSKU = "SKU3",Quantity = 3}}},new Order{OrderID = "orderID2",OrderLines = new List<OrderLine>{new OrderLine{ProductSKU = "SKU4",Quantity = 4},new OrderLine{ProductSKU = "SKU5",Quantity = 5}}}};
//required result is the list of all SKUs in ordersList<string> allSKUs = new List<string>();
//With Select case 2 foreach loops are requiredvar flattenedOrdersLinesSelectCase = orders.Select(o => o.OrderLines);foreach (var flattenedOrderLine in flattenedOrdersLinesSelectCase){foreach (OrderLine orderLine in flattenedOrderLine){allSKUs.Add(orderLine.ProductSKU);}}
//With SelectMany case only one foreach loop is requiredallSKUs = new List<string>();var flattenedOrdersLinesSelectManyCase = orders.SelectMany(o => o.OrderLines);foreach (var flattenedOrderLine in flattenedOrdersLinesSelectManyCase){allSKUs.Add(flattenedOrderLine.ProductSKU);}
//If the required result is flattened list which has OrderID, ProductSKU and Quantity,//SelectMany with selector is very helpful to get the required result//and allows avoiding own For loops what according to my experience do code faster when// hundreds of thousands of data rows must be operatedList<OrderLineForReport> ordersLinesForReport = (List<OrderLineForReport>)orders.SelectMany(o => o.OrderLines,(o, ol) => new OrderLineForReport{OrderID = o.OrderID,ProductSKU = ol.ProductSKU,Quantity = ol.Quantity}).ToList();}}class Order{public string OrderID { get; set; }public List<OrderLine> OrderLines { get; set; }}class OrderLine{public string ProductSKU { get; set; }public int Quantity { get; set; }}class OrderLineForReport{public string OrderID { get; set; }public string ProductSKU { get; set; }public int Quantity { get; set; }}
var array = new string[2]{"I like what I like","I like what you like"};//query1 returns two elements sth like this://fisrt element would be array[5] :[0] = "I" "like" "what" "I" "like"//second element would be array[5] :[1] = "I" "like" "what" "you" "like"IEnumerable<string[]> query1 = array.Select(s => s.Split(' ')).Distinct();
//query2 return back flat result sth like this :// "I" "like" "what" "you"IEnumerable<string> query2 = array.SelectMany(s => s.Split(' ')).Distinct();
class PetOwner{public string Name { get; set; }public List<String> Pets { get; set; }}
public static void SelectManyEx(){PetOwner[] petOwners ={ new PetOwner { Name="Higa, Sidney",Pets = new List<string>{ "Scruffy", "Sam" } },new PetOwner { Name="Ashkenazi, Ronen",Pets = new List<string>{ "Walker", "Sugar" } },new PetOwner { Name="Price, Vernette",Pets = new List<string>{ "Scratches", "Diesel" } } };
// Query using SelectMany().IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);
Console.WriteLine("Using SelectMany():");
// Only one foreach loop is required to iterate// through the results since it is a// one-dimensional collection.foreach (string pet in query1){Console.WriteLine(pet);}
// This code shows how to use Select()// instead of SelectMany().IEnumerable<List<String>> query2 =petOwners.Select(petOwner => petOwner.Pets);
Console.WriteLine("\nUsing Select():");
// Notice that two foreach loops are required to// iterate through the results// because the query returns a collection of arrays.foreach (List<String> petList in query2){foreach (string pet in petList){Console.WriteLine(pet);}Console.WriteLine();}}
/*This code produces the following output:
Using SelectMany():ScruffySamWalkerSugarScratchesDiesel
Using Select():ScruffySam
WalkerSugar
ScratchesDiesel*/