Selecting a subset of elements in LINQ C# with the TakeWhile operator
August 7, 2017 Leave a comment
The TakeWhile extension method in LINQ is similar to Take. With Take you can specify the number of elements to select from a sequence. In the case of TakeWhile we can specify a condition – a boolean function – instead. The operator will take elements from the sequence while the condition is true and then stop.
Data collection:
string[] bands = { "ACDC", "Queen", "Aerosmith", "Iron Maiden", "Megadeth", "Metallica", "Cream", "Oasis", "Abba", "Blur", "Chic", "Eurythmics", "Genesis", "INXS", "Midnight Oil", "Kent", "Madness", "Manic Street Preachers" , "Noir Desir", "The Offspring", "Pink Floyd", "Rammstein", "Red Hot Chili Peppers", "Tears for Fears" , "Deep Purple", "KISS"};
We’ll keep selecting the items until we find one that starts with an ‘E’:
IEnumerable<string> res = bands.TakeWhile(b => b[0] != 'E'); foreach (string s in res) { Console.WriteLine(s); }
This will print all bands from “ACDC” to and including “Chic”. The last item to be selected will be “Chic”, as the one after that, i.e. Eurythmics starts with an ‘E’.
There’s an overload of TakeWhile where you can pass in the index variable of the loop. The following query will keep selecting the bands until we find one that starts with an ‘E’ OR the loop index exceeds 8:
IEnumerable<string> res2 = bands.TakeWhile((b, i) => b[0] != 'E' && i < 8); foreach (string s in res2) { Console.WriteLine(s); }
This time Oasis is the last item to be selected as that is the 8th item, so the “i less than 8” condition was reached first.
View the list of posts on LINQ here.