@@ -148,5 +148,125 @@ public static IEnumerable<List<T>> Split<T>(this IEnumerable<T> enumerable, int
148
148
}
149
149
return splitList ;
150
150
}
151
+
152
+ /// <summary>
153
+ /// Check if the list is null or empty.
154
+ /// </summary>
155
+ /// <typeparam name="T"></typeparam>
156
+ /// <param name="source"></param>
157
+ /// <returns></returns>
158
+ public static bool IsNullOrEmpty < T > ( this IEnumerable < T > source )
159
+ {
160
+ return source == null || ! source . Any ( ) ;
161
+ }
162
+
163
+ /// <summary>
164
+ /// Apply an action to each element of the list.
165
+ /// </summary>
166
+ /// <typeparam name="T"></typeparam>
167
+ /// <param name="source"></param>
168
+ /// <param name="action"></param>
169
+ /// <exception cref="ArgumentNullException"></exception>
170
+ public static void ForEach < T > ( this IEnumerable < T > source , Action < T > action )
171
+ {
172
+ if ( source == null ) throw new ArgumentNullException ( nameof ( source ) ) ;
173
+ if ( action == null ) throw new ArgumentNullException ( nameof ( action ) ) ;
174
+
175
+ foreach ( var item in source )
176
+ {
177
+ action ( item ) ;
178
+ }
179
+ }
180
+
181
+ /// <summary>
182
+ /// Chunk the list into sublists of the specified size.
183
+ /// </summary>
184
+ /// <typeparam name="T"></typeparam>
185
+ /// <param name="source"></param>
186
+ /// <param name="size"></param>
187
+ /// <returns></returns>
188
+ /// <exception cref="ArgumentNullException"></exception>
189
+ /// <exception cref="ArgumentOutOfRangeException"></exception>
190
+ public static IEnumerable < IEnumerable < T > > ChunkBy < T > ( this IEnumerable < T > source , int size )
191
+ {
192
+ if ( source == null ) throw new ArgumentNullException ( nameof ( source ) ) ;
193
+ if ( size <= 0 ) throw new ArgumentOutOfRangeException ( nameof ( size ) , "La dimensione deve essere maggiore di zero." ) ;
194
+
195
+ return source . Select ( ( x , i ) => new { Index = i , Value = x } )
196
+ . GroupBy ( x => x . Index / size )
197
+ . Select ( g => g . Select ( x => x . Value ) ) ;
198
+ }
199
+
200
+ /// <summary>
201
+ /// Get a random element from the list.
202
+ /// </summary>
203
+ /// <typeparam name="T"></typeparam>
204
+ /// <param name="source"></param>
205
+ /// <returns></returns>
206
+ /// <exception cref="ArgumentNullException"></exception>
207
+ /// <exception cref="InvalidOperationException"></exception>
208
+ public static T RandomElement < T > ( this IEnumerable < T > source )
209
+ {
210
+ if ( source == null ) throw new ArgumentNullException ( nameof ( source ) ) ;
211
+ var list = source . ToList ( ) ;
212
+
213
+ if ( list . Count == 0 )
214
+ throw new InvalidOperationException ( "La sequenza non contiene elementi." ) ;
215
+
216
+ Random rng = new Random ( ) ;
217
+ int index = rng . Next ( list . Count ) ;
218
+ return list [ index ] ;
219
+ }
220
+
221
+ /// <summary>
222
+ /// Check if all elements in the list are distinct.
223
+ /// </summary>
224
+ /// <typeparam name="T"></typeparam>
225
+ /// <param name="source"></param>
226
+ /// <returns></returns>
227
+ /// <exception cref="ArgumentNullException"></exception>
228
+ public static bool AllDistinct < T > ( this IEnumerable < T > source )
229
+ {
230
+ if ( source == null ) throw new ArgumentNullException ( nameof ( source ) ) ;
231
+
232
+ var seen = new HashSet < T > ( ) ;
233
+ foreach ( var item in source )
234
+ {
235
+ if ( ! seen . Add ( item ) )
236
+ return false ;
237
+ }
238
+ return true ;
239
+ }
240
+
241
+ /// <summary>
242
+ /// Shuffle the list.
243
+ /// </summary>
244
+ /// <typeparam name="T"></typeparam>
245
+ /// <param name="source"></param>
246
+ /// <returns></returns>
247
+ /// <exception cref="ArgumentNullException"></exception>
248
+ public static IEnumerable < T > Shuffle < T > ( this IEnumerable < T > source )
249
+ {
250
+ if ( source == null ) throw new ArgumentNullException ( nameof ( source ) ) ;
251
+
252
+ Random rng = new Random ( ) ;
253
+ return source . OrderBy ( _ => rng . Next ( ) ) ;
254
+ }
255
+
256
+ /// <summary>
257
+ /// Sum the elements of the list.
258
+ /// </summary>
259
+ /// <typeparam name="T"></typeparam>
260
+ /// <param name="source"></param>
261
+ /// <param name="selector"></param>
262
+ /// <returns></returns>
263
+ /// <exception cref="ArgumentNullException"></exception>
264
+ public static int Sum < T > ( this IEnumerable < T > source , Func < T , int > selector )
265
+ {
266
+ if ( source == null ) throw new ArgumentNullException ( nameof ( source ) ) ;
267
+ if ( selector == null ) throw new ArgumentNullException ( nameof ( selector ) ) ;
268
+
269
+ return source . Select ( selector ) . Sum ( ) ;
270
+ }
151
271
}
152
272
}
0 commit comments