Search code examples
c#asp.netcollectionsextension-methodsienumerable

Split C# collection into equal parts, maintaining sort


I am trying to split a collection into multiple collections while maintaining a sort I have on the collection. I have tried using the following extension method, but it breaks them incorrectly. Basically, if I was to look at the items in the collection, the order should be the same when compared to the broken up collections joined. Here is the code I am using that doesn't work:

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
        {
            int i = 0;
            var splits = from name in list
                         group name by i++ % parts into part
                         select part.AsEnumerable();
            return splits;
        }
  • int parts = number of sub enumerables

Solution

  • I had to make use of this to compare a list of objects to one another in groups of 4... it will keep the objects in the order that the original possessed. Could be expanded to do something other than 'List'

    /// <summary>
    /// Partition a list of elements into a smaller group of elements
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list"></param>
    /// <param name="totalPartitions"></param>
    /// <returns></returns>
    public static List<T>[] Partition<T>(List<T> list, int totalPartitions)
    {
        if (list == null)
            throw new ArgumentNullException("list");
    
        if (totalPartitions < 1)
            throw new ArgumentOutOfRangeException("totalPartitions");
    
        List<T>[] partitions = new List<T>[totalPartitions];
    
        int maxSize = (int)Math.Ceiling(list.Count / (double)totalPartitions);
        int k = 0;
    
        for (int i = 0; i < partitions.Length; i++)
        {
            partitions[i] = new List<T>();
            for (int j = k; j < k + maxSize; j++)
            {
                if (j >= list.Count)
                    break;
                partitions[i].Add(list[j]);
            }
            k += maxSize;
        }
    
        return partitions;
    }