Core.EnumerableExtensions - refactor InGroupsOf to enumerate source only once

This commit is contained in:
Stephan
2013-10-02 13:59:02 +02:00
parent e6bb999d83
commit f9663a9e80

View File

@@ -13,14 +13,23 @@ namespace Umbraco.Core
{
public static IEnumerable<IEnumerable<T>> InGroupsOf<T>(this IEnumerable<T> source, int groupSize)
{
var i = 0;
var length = source.Count();
if (source == null)
throw new NullReferenceException("source");
while ((i * groupSize) < length)
// enumerate the source only once!
var enumerator = source.GetEnumerator();
while (enumerator.MoveNext())
yield return EnumerateGroup(enumerator, groupSize);
}
private static IEnumerable<T> EnumerateGroup<T>(IEnumerator<T> enumerator, int count)
{
var c = 1;
do
{
yield return source.Skip(i * groupSize).Take(groupSize);
i++;
}
yield return enumerator.Current;
} while (c++ < count && enumerator.MoveNext());
}