2013-09-24 94 views
16

Tôi có một danh sách các byte và tôi muốn chia danh sách này thành các phần nhỏ hơn.C#: Chia mảng thành n phần

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

Danh sách này có 6 ô. Ví dụ, tôi muốn chia nó thành 3 phần chứa 2 byte.

Tôi đã cố gắng viết một số cho vòng lặp và sử dụng mảng 2D để đạt được mục đích của mình nhưng tôi không biết đó là một cách tiếp cận chính xác.

  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

mã của bạn như thế nào? có vẻ như nó hoạt động, mặc dù 'rows' và' cols' vẫn chưa rõ ràng ở đây. 'rows' nên là' window' và 'cols' nên là' lst.Count/window'. –

+0

Sử dụng hàng loạt morelinq https://code.google.com/p/morelinq/source/browse/MoreLinq/Batch.cs –

Trả lời

33

Cách tốt nhất là tạo phương pháp chung/mở rộng để tách bất kỳ mảng nào. Đây là của tôi:

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

Hơn nữa, giải pháp này được hoãn lại. Sau đó, chỉ cần gọi split(size) trên mảng của bạn.

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

Theo yêu cầu, đây là một phương pháp/mở rộng tổng quát để có được một mảng 2D vuông từ một mảng:

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

Have fun :)

+0

** Thay đổi ** cấu trúc dữ liệu mong muốn của OP ** hoàn toàn **. Anh ta muốn 'mảng 2D vuông '. –

+0

Không thực sự. 'Mảng 2D vuông 'của anh ta là một cách tiếp cận anh ta đã cố gắng giải quyết vấn đề, không phải là những gì anh ta muốn. Sử dụng 'IEnumerable >' linh hoạt hơn rất nhiều. – ZenLulz

+0

Tất nhiên tôi sẽ đi cho một cái gì đó như 'IEnumerable stuff' hoặc' List stuff'. Nhưng nó có vẻ là những gì OP muốn. Bạn không thể chắc chắn như vậy. Trong thực tế, nếu bạn thực hiện một số phép tính với 'Ma trận', sử dụng' mảng 2 vuông 'sẽ tốt hơn. –

8

sử dụng 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(); 
} 

Đơn giản chỉ cần sử dụng nó

var sublists = SplitToSublists(lst); 
0

Bạn có thể muốn cung cấp cho một thử này.

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

Điều này không thành công và vượt quá giới hạn; bạn cần thay thế "GetRange (i, size)" bằng "GetRange (i, Math.Min (size, bytes.Count - i))" – Dan

0

đây giải pháp Naif tôi:

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