1

予定のリストがあり、それらをループの代わりに 1 週​​間で取得したい場合。

public class appointments
{
     public string Appointment { get; set; }
     public DateTime Start { get; set; }
     public string Location { get; set; }
}

List<appointments> appointment = new List<appointments>();

appointment.Add(new appointments() { Appointment = "meeting", Start = new DateTime(2013, 01,02), Location = "office"});
appointment.Add(new appointments() { Appointment = "lunch",  Start = new DateTime(2013, 01, 07), Location = "cafe" });
appointment.Add(new appointments() { Appointment = "meeting", Start = new DateTime(2013, 01, 08), Location = "cityhall" });
appointment.Add(new appointments() { Appointment = "dentist", Start = new DateTime(2013, 01, 14), Location = "dentist" }); 

から までの期間が必要で、開始日 01-02 が開始週になります2013-01-022013-01-25

したがって、02 から 08 までの項目は 1 週間であり、09 から 16 は別の週であり、最後まで続き、1 週間に 7 日はありません。リストを反復し、特定の週だけを別のメソッドに渡すには、「週のブレーキ日」を事前に計算せずに、最後まで7日を追加するだけです?

4

2 に答える 2

1

以下のコードは、週 1 の場合は "dentist" を返し、週 0 の場合は "meeting,lunch,meeting" を返します。

class Program
{
    static void Main(string[] args)
    {
        List<appointments> appointment = new List<appointments>();

        appointment.Add(new appointments() { Appointment = "meeting", Start = new DateTime(2013, 01, 02), Location = "office" });
        appointment.Add(new appointments() { Appointment = "lunch", Start = new DateTime(2013, 01, 07), Location = "cafe" });
        appointment.Add(new appointments() { Appointment = "meeting", Start = new DateTime(2013, 01, 08), Location = "cityhall" });
        appointment.Add(new appointments() { Appointment = "dentist", Start = new DateTime(2013, 01, 14), Location = "dentist" });

        foreach (var appt in GetAppointmentsByWeek(appointment, 1))
            Console.WriteLine(appt.Appointment);

        Console.ReadLine();
    }

    private static IEnumerable<appointments> GetAppointmentsByWeek(List<appointments> appts, int weeknum)
    {
        if (weeknum < 0)
            return new appointments[] { };

        var ordered = appts.OrderBy(a => a.Start.Ticks);           
        var start = ordered.First().Start.AddDays(weeknum * 7);
        var end = start.AddDays(7);
        return ordered.Where(o => o.Start.Ticks >= start.Ticks && o.Start.Ticks <= end.Ticks);
    }
}

public class appointments
{
    public string Appointment { get; set; }
    public DateTime Start { get; set; }
    public string Location { get; set; }
}
于 2013-05-01T10:59:34.950 に答える
0

これを行うGroupByには、予定を特定の週ごとにグループ化するために on を使用します。このコードはテストされておらず、フリーハンドですが、アイデアは得られるはずです。

private static IEnumerable<appointments> GetAppointmentsByWeek(List<appointments> appts, int weeknum)
{
    var WeekGroup = appts.GroupBy(ap => GetWeekOfYear(ap.Start)).Where(gp => gp.Key == weeknum).FirstOrDefault();

    if (WeekGroup == null) {return new List<appointments>();} //No appointments for this week

    return WeekGroup.Select(gp => gp.ToList());
}

実装する必要がありますGetWeekOfYear( http://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx )-ただし、これは、指定された予定のリストと指定された週番号に対してすべてを返しますその週の予定の。

于 2013-05-01T11:08:32.843 に答える