I have a byte array:
byte[] bytes; // many elements
I need to divide it into subsequence of byte arrays of X elements. For example, x = 4.
If bytes.Length does not multiply by X, then add 0 to last subsequence array so Length of all subsequnce must be X.
Linq available.
PS: my attempts
static void Main(string[] args)
{
List<byte> bytes = new List<byte>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
int c = bytes.Count / 4;
for (int i = 0; i <= c; i+=4)
{
int diff = bytes.Count - 4;
if (diff < 0)
{
}
else
{
List<byte> b = bytes.GetRange(i, 4);
}
}
Console.ReadKey();
}
A Simple solution is to run two loop to split array and check it is possible to split array into two parts such that sum of first_part equal to sum of second_part.
The array cannot be divided into 2 arrays of an equal sum.
Given an array of n non-negative integers. Choose three indices i.e. (0 <= index_1 <= index_ 2<= index_3 <= n) from the array to make four subsets such that the term sum(0, index_1) – sum(index_1, index_2) + sum(index_2, index_3) – sum(index_3, n) is maximum possible.
Approach: For every element in the array, there are two choices, either to include it in the subsequence or not include it. Apply this for every element in the array starting from index 0 until we reach the last index. Print the subsequence once the last index is reached.
Voted answer works if you always get source.Length % size != 0
, though it is too verbose. Here goes a nicer implementation:
public static IEnumerable<T[]> AsChunks<T>(IEnumerable<T> source, int size)
{
var chunk = new T[size];
var i = 0;
foreach(var e in source)
{
chunk[i++] = e;
if (i==size)
{
yield return chunk;
i=0;
}
}
if (i>0) // Anything left?
{
Array.Resize(ref chunk, i);
yield return chunk;
}
}
void Main()
{
foreach(var chunk in AsChunks("Hello World!",5))
Console.WriteLine(new string(chunk));
}
Producing:
This is quite cute:
static class ChunkExtension
{
public static IEnumerable<T[]> Chunkify<T>(
this IEnumerable<T> source, int size)
{
if (source == null) throw new ArgumentNullException("source");
if (size < 1) throw new ArgumentOutOfRangeException("size");
using (var iter = source.GetEnumerator())
{
while (iter.MoveNext())
{
var chunk = new T[size];
chunk[0] = iter.Current;
for (int i = 1; i < size && iter.MoveNext(); i++)
{
chunk[i] = iter.Current;
}
yield return chunk;
}
}
}
}
static class Program
{
static void Main(string[] args)
{
List<byte> bytes = new List<byte>() {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
var chunks = bytes.Chunkify(4);
foreach (byte[] chunk in chunks)
{
foreach (byte b in chunk) Console.Write(b.ToString("x2") + " ");
Console.WriteLine();
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With