Вложенный запрос LINQ с лямбда выражением

Есть очень странное задание, никак не могу разобраться. Обязательное условие — использование лямбда выражения для решения задачи.

Сама задача. Есть некий фитнес -центр. Есть список клиентов вот такого класса.

class Client
    {
        public Client(int code, int year, int month, int totalHours)
        {
            Code = code;
            Year = year;
            Month = month;
            TotalHours = totalHours;
        }

        public override string ToString()
        {
            return Code + " " + Year + " " + Month + " " + TotalHours;
        }

        public int Code;
        public int Year;
        public int Month;
        public int TotalHours;
    }


Code — не нужный параметр, Year — год начала занятий, Month — месяц начала занятий, TotalHours — количество часов занятий в каждом месяце.

Вот список клиентов.

List<Client> clients = new List<Client>();
            clients.Add(new Client(1, 2002, 10, 2));
            clients.Add(new Client(2, 2008, 1, 15));
            clients.Add(new Client(3, 2010, 12, 1));
            clients.Add(new Client(4, 2009, 3, 25));
            clients.Add(new Client(5, 2001, 7, 20));
            clients.Add(new Client(6, 2000, 7, 1));
            clients.Add(new Client(7, 2007, 9, 3));


И сейчас само задание. Нужно для каждой пары «ГОД-МЕСЯЦ», для каждого клиента посчитать сколько он занимался часов с этой даты (или 0, если он начал позже заниматься), потом просуммировать эти значения для текущей даты и на выходе получить список «ГОД — МЕСЯЦ — ВРЕМЯ».

То есть брать по очереди год и месяц, потом для каждого клиента считать сколько он занимался с этого момента времени (пара год-месяц), и суммировать все значения для этой пары. Потом брать следующую пару и делать тоже самое.

Если честно, без linq и лямбда выражений сделаю быстро, а вот с ними как — без понятия. Прошу помощи.
  • Вопрос задан
  • 8313 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Piskov
А в чем странность-то? Код ведь точно такой же, как и без линка, если я правильно понял вашу задачу

var results = from c in clients
	let elapsedMonths = (DateTime.Now.Year * 12 + DateTime.Now.Month) - (c.Year * 12 + c.Month)
	select new
	{
		Year = c.Year,
		Month = c.Month,
		Elapsed =  elapsedMonths > 0 ? elapsedMonths * c.TotalHours : 0
	};
Ответ написан
Jakeroid
@Jakeroid Автор вопроса
К сожалению, вы меня не правильно поняли. Или может я плохо объяснил. Решением задачи, стало следующее выражение.
var result6 = clients.Select(i => new { Year = i.Year, Month = i.Month, TotalTime = clients.Select(j => j.Year < i.Year ? 0 : ((j.Year - i.Year) * 12 + (j.Month - i.Month)) * j.TotalHours).Sum() } ).ToList();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы