C# LINQ表达式:指定最大groupby大小

C# LINQ表达式:指定最大groupby大小,c#,linq,C#,Linq,在LINQ中是否有一种优雅的方法来执行以下操作,或者我应该为此编写一个扩展 我有一个需要按startdate分组的对象列表 比方说 09:00, 13.00, 13.00, 13.00, 15:00 我需要有组的最大大小为2 预期结果是 var groupedStartDates = startDate.GroupBy(x => x.StartDate); List list1 {09.00} list2 {13.00; 13.00} list3 {13.00}

在LINQ中是否有一种优雅的方法来执行以下操作,或者我应该为此编写一个扩展

我有一个需要按startdate分组的对象列表

比方说

09:00, 13.00, 13.00, 13.00, 15:00

我需要有组的最大大小为2

预期结果是

var groupedStartDates = startDate.GroupBy(x => x.StartDate);
List
    list1 {09.00}
    list2 {13.00; 13.00}
    list3 {13.00}
    list4 {15.00}

如果我正确理解您的问题,您可以使用
Take

var result= startDate.GroupBy(x => x.StartDate)
                     .Select(x => x.Take(2))
                     .ToList();

每个组最多包含2个成员,组中的其他项目将不会返回。

初始分组后,您可以按索引(在组中)除以2进行分组,以进行进一步分组,然后使用
SelectMany
将其展平

var result = startDate.GroupBy(x => x.StartDate)
                      .SelectMany(grp => grp.Select((x,i) => new{x,i})
                                            .GroupBy(a => a.i / 2)
                                            .Select(sgrp => sgrp.Select(a => a.x)));
这是正在发生的事情的分解。注意:花括号表示集合,方括号表示具有多个属性的对象

初始数据

09.00,13.00,13.00,13.00,15.00

GroupBy(x=>x.StartDate)

[关键字:09.00,{09.00}],[关键字:13.00,{13.00,13.00,13.00}],[关键字:15.00,{15.00}]

现在将对每个组进行操作,但我将在每个步骤中显示所有组的结果。 在
之后选择((x,i)=>new{x,i})

{[x:09.00,i:0]},{[x:13.00,i:0],[x:13.00,i:1],[x:13.00,i:2]},{[x:15.00,i:0]}

GroupBy(a=>a.i/2)

{[Key:0,{[x:09.00,i:0]},{[Key:0,{[x:13.00,i:0],[x:13.00,i:1]},[Key:1,{[x:13.00,i:2]},{[Key:0,{[x:15.00,i:0]}

.Select(sgrp=>sgrp.Select(a=>a.x))

{{09.00},{{13.00,13.00},{13.00},{15.00}

最后,
SelectMany
将使其平坦化

{09.00},{13.00,13.00},{13.00},{15.00}

请注意,每一行代表一个集合,但我没有在它们周围加上花括号,因为我觉得这会让阅读变得更加困难

或者使用扩展方法

public static IEnumerable<IEnumerable<T>> Bin<T>(this IEnumerable<T> items, int binSize)
{
    return items.Select((x,i) => new{x,i})
                .GroupBy(a => a.i / binSize)
                .Select(grp => grp.Select(a => a.x));
}

我猜OP不是在寻找这个。检查预期的输出。这不是OP所要求的。@Rahusingh我根据我对问题的理解回答了这个问题。让我知道预期的结果:)@RezaAghaei-我既不是反对者,也不是OP。我只是说OP在期待其他东西。@Rahusingh谢谢你的评论。我投了赞成票,因为这是正确的st成功了!但这一步一步的解释让我的头脑融化了。你是个天才!非常感谢你的详细解释和质疑。:)
public static IEnumerable<IEnumerable<T>> Bin<T>(this IEnumerable<T> items, int binSize)
{
    return items.Select((x,i) => new{x,i})
                .GroupBy(a => a.i / binSize)
                .Select(grp => grp.Select(a => a.x));
}
var result = startDate.GroupBy(x => x.StartDate)
                      .SelectMany(grp => grp.Bin(2));