Не могли бы вы помочь отфильтровать коллекцию и создать другую в linq - PullRequest
0 голосов
/ 15 декабря 2010

Я создал следующее, чтобы объяснить мою проблему.

Имеется список с PayDates и периодами.Мне нужно создать новый список, содержащий 1 элемент для каждого периода, ближайшего к его дате платежа.

Таким образом, в приведенном примере список должен возвращать 2 элемента: «1-е число месяца» и «17-е число месяца», так как они наиболее близки к дате выплаты в их периоде

какие-либо предложения?

 private static List<Schedule> GetFilteredScheduleList()
  {
     List<Schedule>oldScheduleList=new List<Schedule>();
     oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 1), Id = 1, Name = "1st of the month", Period = SchedulePeriod.Monthly });
     oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 4), Id = 1, Name = "4th of the month", Period = SchedulePeriod.Monthly });
     oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 19), Id = 1, Name = "19th of the month", Period = SchedulePeriod.Monthly });
     oldScheduleList.Add(new Schedule { PayDate = new DateTime(2012, 1, 3), Id = 1, Name = "3rd of each quarter", Period = SchedulePeriod.Quarterly });
     oldScheduleList.Add(new Schedule { PayDate = new DateTime(2013, 1, 8), Id = 1, Name = "8th each quarter", Period = SchedulePeriod.Quarterly });
     oldScheduleList.Add(new Schedule { PayDate = new DateTime(2011, 1, 17), Id = 1, Name = "17th of the month", Period = SchedulePeriod.Quarterly });

    // Need to create a new list containing 1 item for each period that is nearest to its Pay Date.Starting point it's today's date.
    //  so the list should return 2 items "1st of the month" and "17th of the month" as they are the closest to their paydate in their period

     List<Schedule> newScheduleList = oldScheduleList.Where(x=>x.PayDate)
  }

1 Ответ

4 голосов
/ 15 декабря 2010

Это должно выбрать элемент Schedule из каждого периода, который является ближайшим к настоящему моменту.Это то, что вы имели в виду?

oldScheduleList
    .GroupBy(s => s.Period)
    .Select(
        g => g
              .OrderBy(s => Math.Abs((s.PayDate - DateTime.Now).TotalSeconds))
              .First()
    )

Редактировать:

В ответ на ваш комментарий получить первый элемент за период немного проще.Я прокомментировал предложение Where.Это позволит получить первый период за период (т.е. даты, которые истекли, игнорируются)

oldScheduleList
    .GroupBy(s => s.Period)
    .Select(
        g => g
              //.Where(s => s.Paydate >= DateTime.Now) //filter expired dates
              .OrderBy(s => s.PayDate)
              .First()
    )
...