Skip to content

Commit 3e56754

Browse files
committed
Add new enumerable extensions Chunked
1 parent c3b9d72 commit 3e56754

2 files changed

Lines changed: 106 additions & 4 deletions

File tree

src/DomainCommonExtensions/ArraysExtensions/EnumerableExtensions.cs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414
// </summary>
1515
// ***********************************************************************
1616

17+
using DomainCommonExtensions.CommonExtensions;
18+
using DomainCommonExtensions.CommonExtensions.TypeParam;
19+
using DomainCommonExtensions.DataTypeExtensions;
1720
using System;
1821
using System.Collections.Generic;
1922
using System.Collections.ObjectModel;
2023
using System.ComponentModel;
24+
using System.Data;
2125
using System.Diagnostics.Contracts;
2226
using System.Linq;
2327
using System.Text;
24-
using DomainCommonExtensions.CommonExtensions;
25-
using System.Data;
26-
using DomainCommonExtensions.CommonExtensions.TypeParam;
27-
using DomainCommonExtensions.DataTypeExtensions;
2828

2929
// ReSharper disable UnusedParameter.Local
3030
// ReSharper restore PossibleMultipleEnumeration
@@ -519,5 +519,38 @@ public static IEnumerable<T> ForEachAndReturn<T>(this IEnumerable<T> list, Actio
519519

520520
return list;
521521
}
522+
523+
/// <summary>
524+
/// Chunk source array of data by size.
525+
/// </summary>
526+
/// <param name="source">Source list/array.</param>
527+
/// <param name="chunkSize">The chunk size. Default value is 100.</param>
528+
/// <typeparam name="T">Type of list</typeparam>
529+
/// <returns></returns>
530+
/// <remarks></remarks>
531+
public static IEnumerable<IEnumerable<T>> Chunked<T>(this IEnumerable<T> source, int chunkSize = 100)
532+
{
533+
if (source.IsNullOrEmptyEnumerable())
534+
return new List<IEnumerable<T>>();
535+
if (chunkSize.IsNull() || chunkSize.IsLessOrEqualZero())
536+
return new List<IEnumerable<T>>(1) { source };
537+
538+
var chunkArray = source.ToArray();
539+
var chunksCount = (int)Math.Ceiling((double)source.Count() / chunkSize);
540+
var chunks = new List<IEnumerable<T>>(chunksCount);
541+
542+
for (var chunkIndex = 0; chunkIndex < chunksCount; chunkIndex++)
543+
{
544+
var newChunkSize = chunkIndex == chunksCount - 1 ? chunkArray.Length - (chunkSize * chunkIndex) : chunkSize;
545+
var newChunkSourceIndex = chunkIndex.IsZero() ? chunkIndex : (chunkSize * chunkIndex) - 1;
546+
547+
var chunk = new T[newChunkSize];
548+
Array.Copy(chunkArray, newChunkSourceIndex, chunk, 0, newChunkSize);
549+
550+
chunks.Add(chunk);
551+
}
552+
553+
return chunks;
554+
}
522555
}
523556
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// ***********************************************************************
2+
// Assembly : RzR.Shared.Extensions.DataTypeTests
3+
// Author : RzR
4+
// Created On : 2025-06-27 08:10
5+
//
6+
// Last Modified By : RzR
7+
// Last Modified On : 2025-06-27 08:10
8+
// ***********************************************************************
9+
// <copyright file="EnumerableTests.cs" company="RzR SOFT & TECH">
10+
// Copyright © RzR. All rights reserved.
11+
// </copyright>
12+
//
13+
// <summary>
14+
// </summary>
15+
// ***********************************************************************
16+
17+
using System.Linq;
18+
using DomainCommonExtensions.ArraysExtensions;
19+
using Microsoft.VisualStudio.TestTools.UnitTesting;
20+
21+
namespace DataTypeTests.DataTests
22+
{
23+
[TestClass]
24+
public class EnumerableTests
25+
{
26+
[TestMethod]
27+
public void ChunkArray_Chunked_5_Test()
28+
{
29+
var arrInput = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
30+
31+
var chunks = arrInput.Chunked(5).ToArray();
32+
33+
Assert.IsNotNull(chunks);
34+
Assert.AreEqual(3, chunks.Count());
35+
Assert.AreEqual(5, chunks[0].Count());
36+
Assert.AreEqual(5, chunks[1].Count());
37+
Assert.AreEqual(2, chunks[2].Count());
38+
}
39+
40+
[TestMethod]
41+
public void ChunkArray_Chunked_2_Test()
42+
{
43+
var arrInput = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
44+
45+
var chunks = arrInput.Chunked(2).ToArray();
46+
47+
Assert.IsNotNull(chunks);
48+
Assert.AreEqual(6, chunks.Count());
49+
Assert.AreEqual(2, chunks[0].Count());
50+
Assert.AreEqual(2, chunks[1].Count());
51+
Assert.AreEqual(2, chunks[2].Count());
52+
Assert.AreEqual(2, chunks[3].Count());
53+
Assert.AreEqual(2, chunks[4].Count());
54+
Assert.AreEqual(2, chunks[5].Count());
55+
}
56+
57+
[TestMethod]
58+
public void ChunkArray_Chunked_20_Test()
59+
{
60+
var arrInput = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
61+
62+
var chunks = arrInput.Chunked(20).ToArray();
63+
64+
Assert.IsNotNull(chunks);
65+
Assert.AreEqual(1, chunks.Count());
66+
Assert.AreEqual(12, chunks[0].Count());
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)