Вот простое консольное приложение, которое использует аналогичный подход, описанный @Oguz Ozgul:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp3
{
internal class Person
{
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public int Age
=> (int) Math.Floor((DateTimeOffset.UtcNow - DateOfBirth).TotalDays / 365);
public int AgeGroup
{
get
{
if (Age < 15) // [0,14]
return 1;
if (Age < 20) // [15,19]
return 2;
if (Age < 30) // [20,29]
return 3;
if (Age < 40) // [30,39]
return 4;
if (Age < 60) // [40, 59]
return 5;
return 6; // 60+
}
}
}
internal class Program
{
private static readonly Dictionary<int, string> _ageGroupRanges
= new Dictionary<int, string>
{
{1, "0 to 14"},
{2, "15 to 19"},
{3, "20 to 29"},
{4, "30 to 39"},
{5, "40 to 59"},
{6, "60+"}
};
private static void Main(string[] args)
{
var people = new List<Person>
{
new Person {Name = "Joe", DateOfBirth = new DateTime(1980, 01, 01)},
new Person {Name = "Dan", DateOfBirth = new DateTime(1982, 01, 01)},
new Person {Name = "Laura", DateOfBirth = new DateTime(2010, 01, 01)},
new Person {Name = "Beth", DateOfBirth = new DateTime(2020, 01, 01)}
};
var peopleGroupedByAge = people
.GroupBy(p => p.AgeGroup)
.OrderBy(g => g.Key);
foreach (var group in peopleGroupedByAge)
{
var ageGroup = group.Key;
var ageGroupRange = _ageGroupRanges[ageGroup];
var namesOfPeopleInGroup = string.Join(", ", group.Select(p => p.Name));
Console.WriteLine($"Age group {ageGroup} ({ageGroupRange}): {namesOfPeopleInGroup}");
}
Console.ReadKey(true);
}
}
}
Наиболее важные биты - это вычисленные свойства Age
и AgeGroup
, добавленные к Person
объект. Пройдите по коду в отладчике и осмотрите там значения - вы увидите, что они инкапсулируют логику c, вычисляющую, к какой возрастной группе человек относится.
Наконец, нам нужно сгруппировать наши Person
объекты в группы в зависимости от их возрастной группы. Мы можем добиться этого методом GroupBy
:
var peopleGroupedByAge = people
.GroupBy(p => p.AgeGroup)
.OrderBy(g => g.Key);