1

このlinqクエリで少し問題が発生しました:

allStatsデータで満たされたリスト ( ) があります (allItemsクラスを参照)。リストには、次のように月と週番号で区切られているように、分割する必要があるさまざまな日のいくつかのエントリが含まれています。

    MonthNumber: 1,
    List<Weeks> Weeks:
        WeekNumber: 1,
        List<Days> Days:
            PunchedInLate: true,
            PunchedOutLate: false,
            PunchInDate: 2013-1-1 08:20:10,
            PunchOutDate: 2013-1-1 15:00:00
            PunchedInLate: true,
            PunchedOutLate: false,
            PunchInDate: 2013-1-2 08:20:10,
            PunchOutDate: 2013-1-2 15:00:00
            ...
            PunchedInLate: true,
            PunchedOutLate: false,
            PunchInDate: 2013-1-5 08:20:10,
            PunchOutDate: 2013-1-5 15:00:00
    MonthNumber: 1,
    List<Weeks> Weeks:
        WeekNumber: 2,
        List<Days> Days:
            PunchedInLate: true,
            PunchedOutLate: false,
            PunchInDate: 2013-1-10 08:20:10,
            PunchOutDate: 2013-1-10 15:00:00
            PunchedInLate: true,
            PunchedOutLate: false,
            PunchInDate: 2013-1-12 08:20:10,
            PunchOutDate: 2013-1-12 15:00:00

PasteBin - サンプル プログラムをダウンロードして、マシンから実行できます。

それは本質的に、私が作成しようとしているこの質問の答えへのアドオンです: SO - リストの一部を2つのリストに分割し、それら2つを結合します

編集:申し訳ありませんが、このエラーを生成する最初のキャストではなく、最後に .ToList() メソッドを試したことを忘れていました:

Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.IEnumerable<TestClass.Weeks>>' to 'System.Collections.Generic.List<TestClass.Weeks>'

public class allItems
{
    public DateTime PunchInDate { get; set; }
    public DateTime PunchOutDate { get; set; }
    public DayOfWeek DayOfWeek { get; set; }
    public int WeekNumber { get; set; }
    public int MonthNumber { get; set; }
    public bool PunchedInLate { get; set; }
    public bool PunchedOutLate { get; set; }
}
public class Months
{
    public int MonthNumber { get; set; }
    public List<Weeks> Weeks { get; set; }
}
public class Weeks
{
    public int WeekNumber { get; set; }
    public List<Days> Days { get; set; }
}
public class Days
{
    public bool PunchedInLate { get; set; }
    public bool PunchedOutLate { get; set; }
    public DateTime PunchInDate { get; set; }
    public DateTime PunchOutDate { get; set; }
    public DayOfWeek DayOfWeek { get; set; } 
}

そしてコード:

List<allItems> allStats = getAllStats(userId);
List<Months> stats = new List<Months>();
var asItems =
    from item in allStats
    group item by new { month = item.MonthNumber } into Month
    select new Months()
    {
        MonthNumber = Month.Key.month,
        Weeks = Month.Select(week =>
            from weeks in allStats
            group weeks by new { week = weeks.WeekNumber } into Week
            select new Weeks()
            {
                //WeekNumber = week.WeekNumber,
                WeekNumber = Week.Key.week, // I just noticed that I guess that I 
                                            // need this here, so I can group the 
                Days = Month.Select(days => // days correctly, right?
                    new Days()
                    {
                        PunchedInLate = days.PunchedInLate,
                        PunchedOutLate = days.PunchedOutLate,
                        DayOfWeek = days.DayOfWeek,
                        PunchInDate = days.PunchInDate,
                        PunchOutDate = days.PunchOutDate
                    }).ToList()
            }).ToList()
    };
List<Months> stat = asItems.ToList();
4

3 に答える 3

4

問題は、が返さMonth.Select(...) れないList<Weeks>ことです。キャストを削除して、次のものを使用できます。

Week = Month.Select(week => 
    ... code as before ...
).ToList()

編集:わかりました、まだ何が間違っているのかわかりました。ごとに、複数のオブジェクトweekを生成するクエリを使用しています。したがって、この部分: Weeks

from weeks in allStats
...
select new Weeks() { ... }

のタイプですIEnumerable<Weeks>()-そしてそれは射影の本体として使用されているMonth.Select(week => ...)ので、シーケンスのシーケンスがあります。それを単一のリストに変換する方法が明確ではありません。たとえば、次のように使用できます。

Week = Month.Select(week => 
    ... code as before ...
).First().ToList()

また:

Week = Month.Select(week => 
    ... code as before ...
).SelectMany(x => x).ToList()

あなたが達成しようとしていることについて、私たちは単に十分に知りません。

于 2013-03-11T13:16:39.540 に答える
1

キャストしている場所に問題があるように見えます:

List<allItems> allStats = getAllStats(userId);
List<Months> stats = new List<Months>();
var asItems =
    from item in allStats
    group item by new { month = item.MonthNumber } into Month
    select new Months()
    {
        MonthNumber = Month.Key.month,
        Weeks = Month.Select(week => //Don't cast here, put a ToList() at the end.
            from weeks in allStats
            group weeks by new { week = weeks.WeekNumber } into Week
            select new Weeks()
            {
                WeekNumber = week.WeekNumber,
                Days = Month.Select(days =>
                    new Days()
                    {
                        PunchedInLate = days.PunchedInLate,
                        PunchedOutLate = days.PunchedOutLate,
                        DayOfWeek = days.DayOfWeek,
                        PunchInDate = days.PunchInDate,
                        PunchOutDate = days.PunchOutDate
                    }).ToList()
            }).ToList(); //*** ToList() added here ***
    };
List<Months> stat = asItems.ToList();
于 2013-03-11T13:18:01.197 に答える
0

ToListYout 'Months' 選択後が欠落しているようです:

List<allItems> allStats = getAllStats(userId);
List<Months> stats = new List<Months>();
var asItems =
    from item in allStats
    group item by new { month = item.MonthNumber } into Month
    select new Months()
    {
        MonthNumber = Month.Key.month,
        Weeks = Month.Select(week =>
            from weeks in allStats
            group weeks by new { week = weeks.WeekNumber } into Week
            select new Weeks()
            {
                WeekNumber = week.WeekNumber,
                Days = Month.Select(days =>
                    new Days()
                    {
                        PunchedInLate = days.PunchedInLate,
                        PunchedOutLate = days.PunchedOutLate,
                        DayOfWeek = days.DayOfWeek,
                        PunchInDate = days.PunchInDate,
                        PunchOutDate = days.PunchOutDate
                    }).ToList()
            }).ToList()     // <-- here
    };
List<Months> stat = asItems.ToList();

その場合もキャストは必要ないことに注意してください。

于 2013-03-11T13:17:35.637 に答える