数据来自List<分成另一个列表<2个嵌套的List

本文关键字:List 嵌套 2个 列表 数据 另一个 | 更新日期: 2023-09-27 18:03:31

我在使用这个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 -将List的部分拆分为2个List,并将这2个List连接起来

编辑:我很抱歉,我忘了说,我已经尝试了。tolist()方法在结束,而不是在开始时产生此错误的cast:

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();

数据来自List<分成另一个列表<2个嵌套的List<T>

问题是您的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()

我们只是不太了解你想要达到的目标。

在我看来,你有一个问题,你的铸造:

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();

看起来您在'Months' select后缺少ToList:

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();

请注意,在这种情况下也不需要强制转换。

相关文章: