using System;
using System.Collections.Generic;
public static class TestExtensions
{
public static IEnumerable<List<T>> GroupsOf<T>(this IEnumerable<T> sequence, int count)
{
if (sequence == null)
{
throw new ArgumentNullException("sequence");
}
return GroupsOfImpl<T>(sequence, count);
}
private static IEnumerable<List<T>> GroupsOfImpl<T>(IEnumerable<T> sequence, int count)
{
List<T> answer = new List<T>(count);
foreach (T element in sequence)
{
answer.Add(element);
if (answer.Count == count)
{
yield return answer;
answer = new List<T>(count);
}
}
if (answer.Count != 0)
{
yield return answer;
}
}
}
public class Test
{
public static void Main()
{
var input = new List<int>{1, 2, 3, 3, 2, 1, 0, 4};
foreach (List<int> chunk in input.GroupsOf(3))
{
foreach (int element in chunk)
{
Console.WriteLine(element);
}
Console.WriteLine("End Group!");
Console.WriteLine();
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCnB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEV4dGVuc2lvbnMKewoJcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxMaXN0PFQ+PiBHcm91cHNPZjxUPih0aGlzIElFbnVtZXJhYmxlPFQ+IHNlcXVlbmNlLCBpbnQgY291bnQpCgl7CgkJaWYgKHNlcXVlbmNlID09IG51bGwpCgkJewoJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJzZXF1ZW5jZSIpOwoJCX0KCgkJcmV0dXJuIEdyb3Vwc09mSW1wbDxUPihzZXF1ZW5jZSwgY291bnQpOwoJfQoKCXByaXZhdGUgc3RhdGljIElFbnVtZXJhYmxlPExpc3Q8VD4+IEdyb3Vwc09mSW1wbDxUPihJRW51bWVyYWJsZTxUPiBzZXF1ZW5jZSwgaW50IGNvdW50KQoJewoJCUxpc3Q8VD4gYW5zd2VyID0gbmV3IExpc3Q8VD4oY291bnQpOwoJCWZvcmVhY2ggKFQgZWxlbWVudCBpbiBzZXF1ZW5jZSkKCQl7CgkJCWFuc3dlci5BZGQoZWxlbWVudCk7CgkJCWlmIChhbnN3ZXIuQ291bnQgPT0gY291bnQpCgkJCXsKCQkJCXlpZWxkIHJldHVybiBhbnN3ZXI7CgkJCQlhbnN3ZXIgPSBuZXcgTGlzdDxUPihjb3VudCk7CgkJCX0KCQl9CgoJCWlmIChhbnN3ZXIuQ291bnQgIT0gMCkKCQl7CgkJCXlpZWxkIHJldHVybiBhbnN3ZXI7CgkJfQoJfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJdmFyIGlucHV0ID0gbmV3IExpc3Q8aW50PnsxLCAyLCAzLCAzLCAyLCAxLCAwLCA0fTsKCQlmb3JlYWNoIChMaXN0PGludD4gY2h1bmsgaW4gaW5wdXQuR3JvdXBzT2YoMykpCgkJewoJCQlmb3JlYWNoIChpbnQgZWxlbWVudCBpbiBjaHVuaykKCQkJewoJCQkJQ29uc29sZS5Xcml0ZUxpbmUoZWxlbWVudCk7CgkJCX0KCgkJCUNvbnNvbGUuV3JpdGVMaW5lKCJFbmQgR3JvdXAhIik7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJfQoJfQp9