1

我有一系列汽车对象,我正在像这样查看它们:

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

我现在意识到我只能在幻灯片上放 5 辆车,所以我需要将 carCollection 分解为 5 个集合,然后循环遍历这 5 个(所以我为每 5 辆汽车创建一个新幻灯片存在于集合中。

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

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

4

4 回答 4

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);
   }
}
于 2013-08-13T03:22:36.953 回答
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();
于 2013-08-13T08:21:00.237 回答
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();
于 2013-08-13T03:36:39.113 回答
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);
    }
});
于 2013-08-13T09:05:59.167 回答