I have this block of code.
var foundAppointments = ServiceLink.FindAppointments(User, SiteSecureKey);
var MondayAppointments = foundAppointments.SelectMany(x => x.Where(y => y.StartTime.Date.DayOfWeek == DayOfWeek.Monday)).ToList();
Now I have a global list which I add each days appointments too eg Monday, Tuesday, Wed etc..
Then I run this:
Appointments.Add(MondayAppointments); ..........
Is there any whay I can run the Monday through Sunday appointments than having to write.
var TuesdayAppointments = foundAppointments.SelectMany(x=>x.Where(y => y.StartTime.Date.DayOfWeek == DayOfWeek.Tuesday)).ToList();
var WednesdayAppointments = foundAppointments.SelectMany(x=>x.Where(y => y.StartTime.Date.DayOfWeek == DayOfWeek.Wednesday)).ToList();
var ThursdayAppointments = foundAppointments.SelectMany(x=>x.Where(y =>y.StartTime.Date.DayOfWeek == DayOfWeek.Thursday)).ToList();
var FridayAppointments = foundAppointments.SelectMany(x=>x.Where(y => y.StartTime.Date.DayOfWeek == DayOfWeek.Friday)).ToList();
var SaturdayAppointments = foundAppointments.SelectMany(x => x.Where(y => y.StartTime.Date.DayOfWeek == DayOfWeek.Saturday)).ToList();
var SundayAppointments = foundAppointments.SelectMany(x => x.Where(y => y.StartTime.Date.DayOfWeek == DayOfWeek.Saturday)).ToList();
Appointments.Add(TuesdayAppointments);
Appointments.Add(WednesdayAppointments);
Appointments.Add(ThursdayAppointments);
Appointments.Add(FridayAppointments);
Appointments.Add(SaturdayAppointments);
Appointments.Add(SundayAppointments);
Any ideas?
You can enumerate over values from DayOfWeek
enum and get appointments of each day:
var days = Enum.GetValues(typeof(DayOfWeek));
foreach (DayOfWeek dayOfWeek in days)
{
var dayAppointments = foundAppointments.SelectMany(x => x.Where(y => y.StartTime.Date.DayOfWeek == dayOfWeek)).ToList();
Appointments.Add(dayAppointments);
}
If you need Monday to be first, then sort days:
var days = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>()
.OrderBy(d => d == DayOfWeek.Sunday)
.ThenBy(d => d);
BTW why you are adding appointments day by day? Looks like you can add all at once. If you want to add appointments in order starting from Monday:
var appintmentsToAdd = foundAppointments
.SelectMany(x => x)
.OrderBy(a => a.StartTime.Date.DayOfWeek == DayOfWeek.Sunday)
.ThenBy(a => a.StartTime.Date.DayOfWeek)
.ToList();
Appointments.Add(appintmentsToAdd);
Use Enum.GetValues
to get all possible DayOfWeek
values:
var days = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>().ToArray();
And AddRange
to add more than one element to Appointments
at once:
var foundAppointments = ServiceLink.FindAppointments(User, SiteSecureKey);
Appointments.AddRange(days.Select(d => foundAppointments.SelectMany(x=>x.Where(y => y.StartTime.Date.DayOfWeek == d)).ToList());
Or just create Appointments
directly from your query:
var Appointments.AddRange(days.Select(d => foundAppointments.SelectMany(x=>x.Where(y => y.StartTime.Date.DayOfWeek == d)).ToList()).ToList();
Try this:
IEnumerable<DayOfWeek> daysOfWeek = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>();
var appointmentsOnDaysOfWeek = daysOfWeek
.GroupJoin(
foundAppointments,
dayOfWeek => dayOfWeek,
appointment => appointment.StartDate.DayOfWeek,
(day, appointments) => new
{
Day = day,
Appointments = appointments.ToList()
})
.OrderBy(appointmentsOnDay => appointmentsOnDay.Day)
.Select(appointmentsOnDay => appointmentsOnDay.Appointments);
Appointments.AddRange(appointmentsOnDaysOfWeek);
Update : I didn't pay attension to ordering by days when monday should be first. To fix it replace
.OrderBy(appointmentsOnDay => appointmentsOnDay.Day)
with
.OrderBy(appointmentsOnDay => appointmentsOnDay.Day == DayOfWeek.Sunday)
.ThenBy(appointmentsOnDay => appointmentsOnDay.Day)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.