我有一个汽车对象的集合,我正在仔细研究它们:
var slide = CreateSlide();
foreach (var car in carCollection) {
displayonSlide(car, slide)
}
我现在意识到我只能在幻灯片上安装5辆汽车所以我需要将carCollection分解为5个集合,然后通过这5个中的每一个进行循环(所以我为每个创建一个新的幻灯片该系列中有5辆车。
根据特定数量的项目(在这种情况下为5),将单个集合拆分为多个较小集合的最佳方法是什么?
显然,如果不能整除,最后一个集合可能会有余数。
答案 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);
}
});