@@ -143,7 +143,7 @@ public static List<TResult> CreateList<TSource, TResult>(this IEnumerable<TSourc
143143 /// <returns></returns>
144144 public static IEnumerable < T > Clone < T > ( this IEnumerable < T > source )
145145 {
146- Contract . Requires ( source != null ) ;
146+ Contract . Requires < ArgumentNullException > ( source != null ) ;
147147 return source . Select < T , T > ( Clone ) ;
148148 }
149149
@@ -166,7 +166,7 @@ public static IEnumerable<TSource> EmptyIfNull<TSource>(this IEnumerable<TSource
166166 /// <param name="action"></param>
167167 public static void ForEach < TSource > ( this IEnumerable < TSource > source , Action < TSource , int > action )
168168 {
169- Contract . Requires ( action != null ) ;
169+ Contract . Requires < ArgumentNullException > ( action != null ) ;
170170
171171 if ( source != null )
172172 {
@@ -184,29 +184,52 @@ public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSo
184184 /// </summary>
185185 /// <typeparam name="T"></typeparam>
186186 /// <param name="source"></param>
187- /// <param name="partitionSize"></param>
187+ /// <param name="count"></param>
188+ /// <param name="partitionCount"></param>
188189 /// <returns></returns>
189- public static IEnumerable < List < T > > GetPartitions < T > ( this IEnumerable < T > source , int partitionSize )
190+ public static IEnumerable < List < T > > GetPartitions < T > (
191+ this IEnumerable < T > source ,
192+ int count ,
193+ int partitionCount )
190194 {
191- Contract . Requires ( source != null ) ;
192- Contract . Requires ( partitionSize > 0 ) ;
195+ Contract . Requires < ArgumentNullException > ( source != null ) ;
196+ Contract . Requires < ArgumentOutOfRangeException > ( count >= 0 ) ;
197+ Contract . Requires < ArgumentOutOfRangeException > ( partitionCount > 0 ) ;
193198
194- var partition = new List < T > ( partitionSize ) ;
199+ Contract . Ensures ( Contract . Result < IEnumerable < List < T > > > ( ) . Count ( ) <= partitionCount ) ;
200+ Contract . Ensures ( Contract . ForAll ( Contract . Result < IEnumerable < List < T > > > ( ) . ToList ( ) , partition => partition . Count > 0 ) ) ;
195201
196- foreach ( var item in source )
202+ int partitionSize = count / partitionCount ;
203+ int remainder = count % partitionCount ;
204+
205+ using ( var enumerator = source . GetEnumerator ( ) )
197206 {
198- if ( partition . Count == partitionSize )
207+ for ( int partitionIndex = 0 ; partitionIndex < partitionCount ; partitionIndex ++ )
199208 {
200- yield return partition ;
201- partition = new List < T > ( partitionSize ) ;
202- }
203-
204- partition . Add ( item ) ;
205- }
209+ int currentPartitionSize = partitionSize ;
210+ if ( remainder > 0 )
211+ {
212+ currentPartitionSize ++ ;
213+ remainder -- ;
214+ }
206215
207- if ( partition . Count > 0 )
208- {
209- yield return partition ;
216+ if ( currentPartitionSize > 0 )
217+ {
218+ var partition = enumerator . Take ( currentPartitionSize ) ;
219+ if ( partition . Count > 0 )
220+ {
221+ yield return partition ;
222+ }
223+ else
224+ {
225+ break ;
226+ }
227+ }
228+ else
229+ {
230+ break ;
231+ }
232+ }
210233 }
211234 }
212235
@@ -219,7 +242,7 @@ public static IEnumerable<List<T>> GetPartitions<T>(this IEnumerable<T> source,
219242 /// <returns></returns>
220243 public static IndexedItem < T > IndexOf < T > ( this IEnumerable < T > source , Func < T , bool > predicate )
221244 {
222- Contract . Requires ( predicate != null ) ;
245+ Contract . Requires < ArgumentNullException > ( predicate != null ) ;
223246
224247 IndexedItem < T > result = null ;
225248 if ( source != null )
@@ -445,7 +468,7 @@ public static TCollection ToCollection<TSource, TCollection>(
445468 this IEnumerable < TSource > source ,
446469 Func < TCollection > createCollection ) where TCollection : ICollection < TSource >
447470 {
448- Contract . Requires ( createCollection != null ) ;
471+ Contract . Requires < ArgumentNullException > ( createCollection != null ) ;
449472
450473 TCollection collection = default ( TCollection ) ;
451474 if ( source != null )
@@ -470,8 +493,8 @@ public static TCollection ToCollection<TSource, TCollection>(
470493 Func < TCollection > createCollection ,
471494 Action < TCollection , TSource > add )
472495 {
473- Contract . Requires ( createCollection != null ) ;
474- Contract . Requires ( add != null ) ;
496+ Contract . Requires < ArgumentNullException > ( createCollection != null ) ;
497+ Contract . Requires < ArgumentNullException > ( add != null ) ;
475498
476499 TCollection collection = default ( TCollection ) ;
477500 if ( source != null )
@@ -578,12 +601,12 @@ public static SortedDictionary<TKey, TValue> ToSortedDictionary<TKey, TValue>(th
578601 /// <returns></returns>
579602 public static string ToString < T > ( this IEnumerable < T > source , string separator , Func < T , string > toString )
580603 {
581- Contract . Requires ( toString != null ) ;
604+ Contract . Requires < ArgumentNullException > ( toString != null ) ;
582605
583606 string result ;
584607 if ( source != null )
585608 {
586- StringBuilder sb = new StringBuilder ( ) ;
609+ var sb = new StringBuilder ( ) ;
587610 foreach ( var item in source )
588611 {
589612 if ( sb . Length > 0 )
@@ -700,6 +723,8 @@ private static T Clone<T>(T source)
700723
701724 #endregion
702725
726+ #region Private Classes
727+
703728 private sealed class EmptyReadOnlyList < T > : IReadOnlyList < T >
704729 {
705730 private static readonly EmptyReadOnlyList < T > instance = new EmptyReadOnlyList < T > ( ) ;
@@ -738,5 +763,7 @@ IEnumerator IEnumerable.GetEnumerator()
738763 return Enumerable . Empty < T > ( ) . GetEnumerator ( ) ;
739764 }
740765 }
766+
767+ #endregion
741768 }
742769}
0 commit comments