通过linq chunking一个可枚举的

时间:2016-06-08 19:44:02

标签: c# linq

我有一个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);

1 个答案:

答案 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;
            }
        }

    }
}