C#:将数组拆分为n个部分

我有一个字节列表,我想将此列表拆分为较小的部分。

var array = new List {10, 20, 30, 40, 50, 60}; 

此列表有6个单元格。 例如,我想将它分成3个部分,每个部分包含2个字节。

我曾尝试编写一些for循环并使用2D数组来实现我的目的,但我不知道这是一种正确的方法。

  byte[,] array2D = new byte[window, lst.Count / window]; var current = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { array2D[i, j] = lst[current++]; } } 

一种不错的方法是创建一个通用/扩展方法来拆分任何数组。 这是我的:

 ///  /// Splits an array into several smaller arrays. ///  /// The type of the array. /// The array to split. /// The size of the smaller arrays. /// An array containing smaller arrays. public static IEnumerable> Split(this T[] array, int size) { for (var i = 0; i < (float)array.Length / size; i++) { yield return array.Skip(i * size).Take(size); } } 

而且,该解决方案被推迟。 然后,只需在数组上调用split(size)

 var array = new byte[] {10, 20, 30, 40, 50}; var splitArray = array.Split(2); 

根据要求,这是一个从数组中获取方形2D数组的通用/扩展方法:

 public static T[,] ToSquare2D(this T[] array, int size) { var buffer = new T[(int)Math.Ceiling((double)array.Length/size), size]; for (var i = 0; i < (float)array.Length / size; i++) { for (var j = 0; j < size; j++) { buffer[i, j] = array[i + j]; } } return buffer; } 

玩得开心 :)

使用Linq

 public List> SplitToSublists(List source) { return source .Select((x, i) => new { Index = i, Value = x }) .GroupBy(x => x.Index / 100) .Select(x => x.Select(v => v.Value).ToList()) .ToList(); } 

只需使用它

 var sublists = SplitToSublists(lst); 

这有列表清单

 array.Select((s,i) => array.Skip(i * 2).Take(2)).Where(a => a.Any()) 

或者这有项目列表

 array.SelectMany((s,i) => array.Skip(i * 2).Take(2)).Where(a => a.Any()) 

你可能想尝试一下。

 var bytes = new List(10000); int size = 100; var lists = new List>(size); for (int i = 0; i < bytes.Count; i += size) { var list = new List(); list.AddRange(bytes.GetRange(i, size)); lists.Add(list); } 

这是我的天真解决方案:

  public static string[] SplitArrey(string[] ArrInput, int n_column) { string[] OutPut = new string[n_column]; int NItem = ArrInput.Length; // Numero elementi int ItemsForColum = NItem / n_column; // Elementi per arrey int _total = ItemsForColum * n_column; // Emelemti totali divisi int MissElement = NItem - _total; // Elementi mancanti int[] _Arr = new int[n_column]; for (int i = 0; i < n_column; i++) { int AddOne = (i < MissElement) ? 1 : 0; _Arr[i] = ItemsForColum + AddOne; } int offset = 0; for (int Row = 0; Row < n_column; Row++) { for (int i = 0; i < _Arr[Row]; i++) { OutPut[Row] += ArrInput[i + offset] + " "; // <- Here to change how the strings are linked } offset += _Arr[Row]; } return OutPut; }