C# 将集合划分为较小集合的最佳方法是什么

C# 将集合划分为较小集合的最佳方法是什么,c#,collections,C#,Collections,我收集了一些汽车物体,我正在像这样浏览它们: var slide = CreateSlide(); foreach (var car in carCollection) { displayonSlide(car, slide) } 我现在意识到,我只能在一张幻灯片上放5辆车,所以我需要将汽车集合分为5辆集合,然后对这5辆中的每一辆进行循环(因此我为集合中存在的每5辆汽车创建一张新幻灯片) 根据一定数量的项目(本例中为5项)进行扣合,将单个集合拆分为多个较小集合的最佳方式是什么

我收集了一些汽车物体,我正在像这样浏览它们:

 var slide = CreateSlide();
 foreach (var car in carCollection) {
      displayonSlide(car, slide)
 }
我现在意识到,我只能在一张幻灯片上放5辆车,所以我需要将汽车集合分为5辆集合,然后对这5辆中的每一辆进行循环(因此我为集合中存在的每5辆汽车创建一张新幻灯片)

根据一定数量的项目(本例中为5项)进行扣合,将单个集合拆分为多个较小集合的最佳方式是什么


显然,最后一个集合如果不可除,可能会有余数。

我在代码中使用此扩展方法

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> t, int size)
{
   while (t.Any())
   {
      yield return t.Take(size);
      t = t.Skip(size);
   }
}
公共静态IEnumerable拆分(此IEnumerable t,int size)
{
while(t.Any())
{
收益率t.Take(大小);
t=t.Skip(尺寸);
}
}
使用LINQ:

    var slides = carCollection
        .Select((car, index) => new { car, index })
        .GroupBy(c => c.index / 5)
        .Select( g=>
        {
            var slide = CreateSlide();
            g.ToList().ForEach(c => displayonSlide(c.car, slide));
            return slide;
        }).ToList();

如果您的收藏是
列表
,则可以使用以下方法:

var input=新列表{1,5,6,7,8,9,34,14};
变量k=5
var res=可枚举的范围(0,(input.Count-1)/k+1)
.Select(i=>input.GetRange(i*k,Math.Min(k,input.Count-i*k)))
.ToList();

为了避免分组和数学运算

IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> source, int size)
{
    var partition = new T[size];
    var count = 0;

    foreach(var t in source)
    {
        partition[count] = t;
        count ++;

        if (count == size)
        {
            yield return partition;
            var partition = new T[size];
            var count = 0;
        }
    }

    if (count > 0)
    {
        return partition.Take(count);
    }
}

@ByteBlast-您能详细说明一下如何使用take来创建不同的集合吗?起初,我认为使用
take
Skip
的组合将是最好的解决方案,但后来我改变了主意:-p与这里的答案类似,详细介绍了不同implem的性能/内存权衡entations。它从输入集合的开始一次又一次地迭代。就像@MarcinJuraszek所说的,你会得到无限多的第一页。
IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> source, int size)
{
    var partition = new T[size];
    var count = 0;

    foreach(var t in source)
    {
        partition[count] = t;
        count ++;

        if (count == size)
        {
            yield return partition;
            var partition = new T[size];
            var count = 0;
        }
    }

    if (count > 0)
    {
        return partition.Take(count);
    }
}
cars.Partition(5).AsParallel().ForAll(pageSet =>
{
    var slide = CreateSlide();
    foreach(var car in pageSet)
    {
        DisplayOnSlide(car, slide);
    }
});