【问题标题】:Groups the specified bookings based on their consecutive dates根据连续日期对指定的预订进行分组
【发布时间】:2022-07-17 18:57:04
【问题描述】:
var listForTestGroup = new List<Booking>
            {
                new Booking{Project="HR", Date= DateTime.Parse("01/02/2020") , Allocation= 10},
                new Booking{Project="CRM", Date= DateTime.Parse("01/02/2020") , Allocation= 15},
                new Booking{Project="HR", Date= DateTime.Parse("02/02/2020") , Allocation= 10},
                new Booking{Project="CRM", Date= DateTime.Parse("02/02/2020") , Allocation= 15},

                new Booking{Project="HR", Date= DateTime.Parse("03/02/2020") , Allocation= 15},
                new Booking{Project="CRM", Date= DateTime.Parse("03/02/2020") , Allocation= 15},
                new Booking{Project="HR", Date= DateTime.Parse("04/02/2020") , Allocation= 15},
                new Booking{Project="CRM", Date= DateTime.Parse("04/02/2020") , Allocation= 15}
                ,

                new Booking{Project="HR", Date= DateTime.Parse("05/02/2020") , Allocation= 15},
                new Booking{Project="CRM", Date= DateTime.Parse("05/02/2020") , Allocation= 15},
                new Booking{Project="ECom", Date= DateTime.Parse("05/02/2020") , Allocation= 15},
                new Booking{Project="ECom", Date= DateTime.Parse("06/02/2020") , Allocation= 10}

                ,

                new Booking{Project="CRM", Date= DateTime.Parse("06/02/2020") , Allocation= 15},
                new Booking{Project="ECom", Date= DateTime.Parse("07/02/2020") , Allocation= 10},
                new Booking{Project="CRM", Date= DateTime.Parse("07/02/2020") , Allocation= 15}

            };

返回:

          [
            { From:01/02/2020 , To:02/02/2020 , [{ Project:CRM , Allocation:15 },{ Project:HR , Allocation:10 }]  },
            { From:03/02/2020 , To:04/02/2020 , [{ Project:CRM , Allocation:15 },{ Project:HR , Allocation:15 }]  },
            { From:05/02/2020 , To:05/02/2020 , [{ Project:CRM , Allocation:15 },{ Project:HR , Allocation:15 },{ Project:ECom , Allocation:15 }]  },
            { From:06/02/2020 , To:07/02/2020 , [{ Project:CRM , Allocation:15 },{ Project:ECom , Allocation:10 }]  }
          ]

【问题讨论】:

  • 你的分组逻辑是什么?
  • 为什么05/02/2020没过两天?

标签: c# linq


【解决方案1】:

您的分组逻辑不清楚。您是按 4 人一组分组,还是按月分组?

按月分组:

var groupings = bookings
    .OrderBy(x => x.Date)
    .GroupBy(x => x.Date.ToString("yyyy-MM"))
    .Select(g => new 
    {
        From = g.Min(x => x.Date), 
        To = g.Max(x => x.Date), 
        Bookings = g.Select(x => new {x.Project, x.Allocation})
    });

按 4 分组:

var groupings = bookings
    .OrderBy(x => x.Date)
    .Select((b, i) => new { Index = i, Booking = b })
    .GroupBy(g => g.Index / 4)
    .Select(g => new 
    {
        From = g.Min(x => x.Booking.Date), 
        To = g.Max(x => x.Booking.Date), 
        Bookings = g.Select(x => new {x.Booking.Project, x.Booking.Allocation})
    });

【讨论】:

    【解决方案2】:

    这是一个有点棘手的问题

    这就是问题想要的

    listForTestGroup.
                GroupBy(x => x.Project).
                Select((g, idx) => new { Group = g, ProjectID = idx + 1 }).
                SelectMany(x => x.Group.Select(r => new { r.Date, r.Project, r.Allocation, x.ProjectID })).
                GroupBy(r => r.Date).
                Select((g, idx) => new { Group = g, Rank = idx + 1, SumProjectID = g.Sum(r => r.ProjectID), SumAllocation = g.Sum(r => r.Allocation) }).
                SelectMany(x => x.Group.Select(r => new { r.Date, r.Project, r.Allocation, Diff = r.Date.AddDays(-x.Rank), x.SumProjectID, x.SumAllocation })).
                GroupBy(r => new { r.Diff, r.SumProjectID, r.SumAllocation }).
                Select(r => new { From = r.Min(d => d.Date), To = r.Max(d => d.Date), Items = r.Select(s => new { s.Project, s.Allocation }).Distinct().ToList() }).
                OrderBy(r => r.From).
                ToList();
    

    【讨论】:

      【解决方案3】:

      请试试这个代码,它可以帮助你。

       var groupings = bookings
                              .OrderBy(x => x.Date)
                              .GroupBy(x => x.Date.ToString("yyyy-MM"))
                              .Select(g => new BookingGrouping
                              {
                                  From = g.Min(x => x.Date),
                                  To = g.Max(x => x.Date),
                                  Items = g.Select(x => new BookingGroupingItem() {Project= x.Project,Allocation= x.Allocation }).ToList()
                              }).ToList();
      

      【讨论】:

        猜你喜欢
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多