From f9663a9e80936ad4e8f56bafecead071074dbc2b Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 2 Oct 2013 13:59:02 +0200 Subject: [PATCH] Core.EnumerableExtensions - refactor InGroupsOf to enumerate source only once --- src/Umbraco.Core/EnumerableExtensions.cs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/EnumerableExtensions.cs b/src/Umbraco.Core/EnumerableExtensions.cs index 3fa4847a26..dfdd26cd84 100644 --- a/src/Umbraco.Core/EnumerableExtensions.cs +++ b/src/Umbraco.Core/EnumerableExtensions.cs @@ -13,14 +13,23 @@ namespace Umbraco.Core { public static IEnumerable> InGroupsOf(this IEnumerable 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 EnumerateGroup(IEnumerator 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()); }