To help understand the question, context is given from an answer (Courtesy of the answer from @jamiec) on a similar question asked previously.
Given a list:
var list = new List<Child>()
{
new Child()
{School = "School1", FavoriteColor = "blue", Friend = "Bob", Name = "John", SchoolYear = 1},
new Child()
{School = "School1", FavoriteColor = "blue", Friend = "Bob", Name = "Pete", SchoolYear = 2},
new Child()
{School = "School1", FavoriteColor = "blue", Friend = "Bob", Name = "Fred", SchoolYear = 2},
new Child()
{School = "School2", FavoriteColor = "blue", Friend = "Fred", Name = "Bob", SchoolYear = 5},
};
My initial query would look like:
var newList = list
.GroupBy(x => new {x.School, x.Friend, x.FavoriteColor, x.SchoolYear})
.Select(y => new ConsolidatedChild()
{
FavoriteColor = y.Key.FavoriteColor,
Friend = y.Key.Friend,
School = y.Key.School,
SchoolYear = y.Key.SchoolYear
Children = y.ToList()
}
);
and below is test code:
foreach(var item in newList)
{
Console.WriteLine("School: {0} FavouriteColor: {1} Friend: {2} SchoolYear: {3}", item.School,item.FavoriteColor,item.Friend, item.SchoolYear);
foreach(var child in item.Children)
{
Console.WriteLine("\t Name: {0}", child.Name);
}
}
The result for the above code would look like this:
School: School1 FavouriteColor: blue Friend: Bob SchoolYear: 2
Name: Pete
Name: Fred
School: School1 FavouriteColor: blue Friend: Bob SchoolYear: 1
Name: John
School: School2 FavouriteColor: blue Friend: Fred SchoolYear: 5
Name: Bob
In my example I want to group by a range of SchoolYears. I'd want to find the range of SchoolYear values using the original list. If the SchoolYear were 1, then I want to group any value of SchoolYear where it is 0 or 1 or 2 into the same group. If the SchoolYear was 3, then I want to group values of SchoolYear that are 3 or 4 since 2 has been taken by the previous group.
If there is a large gap in the dataset where the next SchoolYear goes from 4 to 7, then I want to group values of SchoolYear that are 6 or 7 or 8. Essentially, SchoolYear +/- 1 depending on if the number is not taken by a previous group. Is this possible and how would you do it?
The result I am looking for is this:
School: School1 FavouriteColor: blue Friend: Bob SchoolYear: 1
Name: Pete
Name: Fred
Name: John
School: School2 FavouriteColor: blue Friend: Fred SchoolYear: 5
Name: Bob