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