1

日時値の一般的なリストがあります:weekADates

TimeTable エンティティの一般的なリストがあります: response.TimeTableWeek

public class TimeTable
{
    public int LessonNumber { get; set; }

    /// <summary>
    /// For each day and lessonnumber in the week there is a schooclass code assigned
    /// </summary>
    public IDictionary<DayOfWeek,string> WeeklySchoolclassCodes { get; set; }
}

このコードを LINQ クエリに変更する必要があります。

var periodList = new List<Period>();
foreach (DateTime date in weekADates)
{
    foreach (TimeTable timetable in response.TimeTableWeek)
    {
        for (int i = 0; i < timetable.WeeklySchoolclassCodes.Count; i++)
        {
            var p = new Period();
            p.LessonNumber = timetable.LessonNumber + 1;
            p.LessonDate = date;
            p.SchoolclassCode = timetable.WeeklySchoolclassCodes[date.DayOfWeek];
            periodList.Add(p);
        }
    }
}

.Select と .SelectMany のさまざまなバリエーションを試しましたが、解決策が得られませんでした。

これは、期間のリストがどのように見えるかです。

ここに画像の説明を入力

これをどのようにlinqに変更しますか?

4

1 に答える 1

3

これを試して

periodList.AddRange(
    from date in weekADates
    from timetable in response.TimeTableWeek
    from schoolclassCode in timetable.WeeklySchoolclassCodes.Values
    select new Period
    {
        LessonNumber = timetable.LessonNumber + 1,
        LessonDate = date,
        SchoolclassCode = schoolclasscode
    });

編集: KeyValuePairs ではなく、辞書から値を取得するように 3 番目を修正しました。

メソッド スタイルでは、次のように記述できます。

periodList.AddRange(
    weekADates.SelectMany(date => 
    response.TimeTableWeek.SelectMany(timetable =>
    timetable.WeeklySchoolclassCodes.Values.Select(schoolclassCode =>
    new Period
    {
        LessonNumber = timetable.LessonNumber + 1,
        LessonDate = date,
        SchoolclassCode = schoolclasscode
    })));
于 2013-02-19T21:49:40.903 に答える