代码之家  ›  专栏  ›  技术社区  ›  Bob

如何将大数组拆分为小数组?

  •  4
  • Bob  · 技术社区  · 15 年前

    给定一个大数组,如何将其拆分为较小的数组,并将较小数组的大小指定为该方法的参数?

    例如,给定数字,split的实现是什么?

    int[] numbers = new int[7845];
    
    int[][] sectionedNumbers = numbers.Split(1000);
    
    sectionedNumbers.Length; //outputs 8
    sectionedNumbers[7].Length; //outputs 845
    
    3 回复  |  直到 15 年前
        1
  •  8
  •   Reed Copsey    15 年前

    您可以使用扩展方法:

    using System;
    
    static class Program
    {
        static T[][] Split<T>(this T[] arrayIn, int length)
        {
            bool even = arrayIn.Length%length == 0;
            int totalLength = arrayIn.Length/length;
            if (!even)
                totalLength++;
    
            T[][] newArray = new T[totalLength][];
            for (int i = 0; i < totalLength;++i )
            {
                int allocLength = length;
                if (!even && i == totalLength - 1)
                    allocLength = arrayIn.Length % length;
    
                newArray[i] = new T[allocLength];
                Array.Copy(arrayIn, i * length, newArray[i], 0, allocLength);
            }
            return newArray;
        }
    
        static void Main(string[] args)
        {
            int[] numbers = new int[8010];
            for (int i = 0; i < numbers.Length; ++i)
                numbers[i] = i;
    
            int[][] sectionedNumbers = numbers.Split(1000);
    
            Console.WriteLine("{0}", sectionedNumbers.Length);
            Console.WriteLine("{0}", sectionedNumbers[7].Length);
            Console.WriteLine("{0}", sectionedNumbers[1][0]);
            Console.WriteLine("{0}", sectionedNumbers[7][298]);
            Console.ReadKey();
        } 
    }
    

    印刷品:

    9
    1000
    1000
    7298
    
        2
  •  7
  •   stevemegson    15 年前

    这不一定是个好主意,但这里有一个实现,它将这个拆分操作概括为 IEnumerable<T> 返回一个 IEnumerable<IEnumerable<T>> .

    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> input, int size)
    {
        return input.Select((a, i) => new { Item = a, Index = i })
                    .GroupBy( b => (b.Index / size))
                    .Select(c => c.Select(d => d.Item));
    }
    
        3
  •  1
  •   MusiGenesis    15 年前

    里德打败了我,但我的方法是:

    public int[][] Split(int[] source, int size)
    {
        int fullArrayCount = source.Length / size;
        int totalArrayCount = fullArrayCount;
        int remainder = source.Length - (fullArrayCount * size);
        if (remainder > 0)
        {
            totalArrayCount++;
        }
        int[][] output = new int[totalArrayCount][];
        for (int i = 0; i < fullArrayCount; i++)
        {
            output[i] = new int[size];
            Array.Copy(source, i * size, output[i], 0, size);
        }
        if (totalArrayCount != fullArrayCount)
        {
            output[fullArrayCount] = new int[remainder];
            Array.Copy(source, fullArrayCount * size,
                output[fullArrayCount], 0, remainder);
        }
    
        return output;
    }