2013-09-24 102 views
16

我有一個字節列表,我想將這個列表拆分成更小的部分。C#:將數組拆分爲n個部分

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

此列表有6個單元格。例如,我想將它分成3個部分,每部分包含2個字節。

我試圖寫一些循環和使用二維數組來實現我的目的,但我不知道這是一個正確的方法。

  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++]; 
       } 
      } 
+0

你的代碼如何?看起來像它的工作,雖然'行「和'cols'在這裏仍然不清楚。 'rows'應該是'window','cols'應該是'lst.Count/window'。 –

+0

使用morelinq批處理https://code.google.com/p/morelinq/source/browse/MoreLinq/Batch.cs –

回答

33

一個不錯的方法是創建一個泛型/擴展方法來拆分任何數組。這是我的:

/// <summary> 
/// Splits an array into several smaller arrays. 
/// </summary> 
/// <typeparam name="T">The type of the array.</typeparam> 
/// <param name="array">The array to split.</param> 
/// <param name="size">The size of the smaller arrays.</param> 
/// <returns>An array containing smaller arrays.</returns> 
public static IEnumerable<IEnumerable<T>> Split<T>(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); 

按照要求,這裏是一個通用/擴展方法從陣列得到一個正方形二維數組:

public static T[,] ToSquare2D<T>(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; 
} 

玩得開心:)

+0

這**改變了**期望的OP **數據結構**完全**。他想要「正方形2D陣列」。 –

+0

不是。他的「正方形2D陣列」是他試圖解決問題的一種方法,而不是他想得到的。使用IEnumerable >'更靈活。 – ZenLulz

+0

當然,我會去'IEnumerable stuff'或'List stuff'之類的東西。但它似乎是OP想要的。你不能這麼肯定。事實上,如果你用'Matrix'做一些計算,使用'square 2D arrays'會更好。 –

8

使用Linq

public List<List<byte>> SplitToSublists(List<byte> 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); 
0

你可能想試試這個。

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

此失敗並超出界限;您需要將「GetRange(i,size)」替換爲「GetRange(i,Math.Min(size,bytes.Count - i))」 – Dan

0

這裏我納伊夫的解決方案:

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; 
    }