This is a late reply to this thread, but here is a method that doesn't use any temporary storage:
public static class EnumerableExt
{
    public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> input, int blockSize)
    {
        var enumerator = input.GetEnumerator();
        while (enumerator.MoveNext())
        {
            yield return nextPartition(enumerator, blockSize);
        }
    }
    private static IEnumerable<T> nextPartition<T>(IEnumerator<T> enumerator, int blockSize)
    {
        do
        {
            yield return enumerator.Current;
        }
        while (--blockSize > 0 && enumerator.MoveNext());
    }
}
And some test code:
class Program
{
    static void Main(string[] args)
    {
        var someNumbers = Enumerable.Range(0, 10000);
        foreach (var block in someNumbers.Partition(100))
        {
            Console.WriteLine("\nStart of block.");
            foreach (int number in block)
            {
                Console.Write(number);
                Console.Write(" ");
            }
        }
        Console.WriteLine("\nDone.");
        Console.ReadLine();
    }
}
However, do note the comments below for the limitations of this approach:
- If you change the - foreachin the test code to- foreach (var block in someNumbers.Partition(100).ToArray())then it doesn't work any more.
 
- It isn't threadsafe.