我有一个IEnumerable。我想把它搞定,即说有500个元素,我想要10个50个元素块。我试过这个
while (true)
{
var page = ret.Take(pagesize).ToList();
.. do stuff with page
}
但每次都从头开始。我对以上模型(每页上的外部循环)感到满意。或者看起来像这样的
ret.ChunkIt(pagesize).Select(chunk => >do stuff with the page)
我想避免一些实现整个列表的东西(可能很大)。就是做了什么
List<List<object>> chunks = ret.Chunkit(100);
答案 0 :(得分:0)
我已经为我正在开发的开源项目实现了类似的功能,做了一些更改以使其作为扩展工作
public static class Extension
{
private IEnumerable<T> Segment<T>( IEnumerator<T> iter, int size, out bool cont )
{
var ret= new List<T>( );
cont = true;
bool hit = false;
for ( var i=0 ; i < size ; i++ )
{
if ( iter.MoveNext( ) )
{
hit = true;
ret.Add( iter.Current );
}
else
{
cont = false;
break;
}
}
return hit ? ret : null;
}
/// <summary>
/// Breaks the collection into smaller chunks
/// </summary>
public IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> collection, int size )
{
bool shouldContinue = collection!=null && collection.Any();
using ( var iter = collection.GetEnumerator( ) )
{
while ( shouldContinue )
{
//iteration of the enumerable is done in segment
var result = Segment( iter, size, out shouldContinue );
if ( shouldContinue || result != null )
yield return result;
else yield break;
}
}
}
}