バイトのリストがあり、このリストを小さな部分に分割します。
var array = new List<byte> {10, 20, 30, 40, 50, 60};
このリストには6つのセルがあります。たとえば、各2バイトを含む3つの部分に分割します。
私はいくつかの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++];
}
}
良い方法は、任意の配列を分割するジェネリック/拡張メソッドを作成することです。これは私のものです:
_/// <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);
_
要求に応じて、配列から正方形の2D配列を取得するジェネリック/拡張メソッドを次に示します。
_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;
}
_
楽しんで :)
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);
これはリストのリストを持つために
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())
ここで私のnaifソリューション:
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;
}
これを試してみてください。
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);
}