将集合分区为较小集合的最佳方法是什么

时间:2013-08-13 03:07:43

标签: c# collections

我有一个汽车对象的集合,我正在仔细研究它们:

 var slide = CreateSlide();
 foreach (var car in carCollection) {
      displayonSlide(car, slide)
 }

我现在意识到我只能在幻灯片上安装5辆汽车所以我需要将carCollection分解为5个集合,然后通过这5个中的每一个进行循环(所以我为每个创建一个新的幻灯片该系列中有5辆车。

根据特定数量的项目(在这种情况下为5),将单个集合拆分为多个较小集合的最佳方法是什么?

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

4 个答案:

答案 0 :(得分:3)

我将此扩展方法用于我的代码

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您的收藏集是List,则可以使用GetRange()方法:

var input = new List<int> { 1, 5, 6, 7, 8, 9, 34, 14 };
var k = 5

var res = Enumerable.Range(0, (input.Count - 1) / k + 1)
                    .Select(i => input.GetRange(i * k, Math.Min(k, input.Count - i * k)))
                    .ToList();

答案 3 :(得分:0)

为了避免分组和数学,

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