我正在尝试将一个byte []数组'a'放入List'b'中,但它无效。假设我有这个字节数组'a'。
12344
23425
34426
34533
我想将它变成4项(行数)列表,但这不起作用。 (设置中间字节[]然后添加它)
byte[] a = {1,2,3,4,4,2,3,4,2,5,3,4,4,2,6,3,4,5,3,3};
List<byte[]> b = new List<byte[]>();
byte[] inter_byte= new byte[5];
for (int u=0; u<4; u++)
{
for (int p=0; p<5; p++)
{
inter_byte[u] = file[(5*u) + p];
}
b.Add(inter_byte);
}
我得到的是List 4行长,但它是最后一行。 最好的方法是什么?
答案 0 :(得分:6)
您的字节数组是引用类型,这意味着在每个循环中更改它会更改存储的数据。在每个循环中声明它应该有效:
byte[] a = {1,2,3,4,4,2,3,4,2,5,3,4,4,2,6,3,4,5,3,3};
List<byte[]> b = new List<byte[]>();
for (int u=0; u<4; u++)
{
byte[] inter_byte= new byte[5];
for (int p=0; p<5; p++)
{
inter_byte[p] = a[(5*u) + p];
}
b.Add(inter_byte);
}
答案 1 :(得分:5)
您需要在每次迭代中重新分配inter_byte
,否则它将被重用并且您正在替换行。
答案 2 :(得分:2)
这样的事情应该这样做......(除非我误解了这个问题)
List<byte[]> b = a.Select((by, i) => new { group = i / 5, value = by })
.GroupBy(item => item.group)
.Select(group => group.Select(v => v.value).ToArray())
.ToList();
将字节分组为5个数组到列表中。
答案 3 :(得分:1)
inter_byte
是对字节数组的引用。您只需要分配实际的字节数组(使用new byte[5]
。您需要在循环中执行此操作。
答案 4 :(得分:0)
试试这个:
byte[] a = {1,2,3,4,4,2,3,4,2,5,3,4,4,2,6,3,4,5,3,3};
List<byte[] b = new List<byte[]>();
for (int u=0; u<4; u++)
{
byte[] inter_byte= new byte[5];
for (int p=0; p<5; p++)
{
inter_byte[u] = file[(5*u) + p];
}
b.Add(inter_byte);
}
答案 5 :(得分:0)
var a = new byte[]
{
1, 2, 3, 4, 4,
2, 3, 4, 2, 5,
3, 4, 4, 2, 6,
3, 4, 5, 3, 3
};
var b = new List<byte[]>();
int groupSize = 5;
for (int i = 0; i < a.Length; i += groupSize)
{
int interSize = Math.Min(a.Length - i, groupSize);
var interByte = new byte[interSize];
Buffer.BlockCopy(a, i, interByte, 0, interSize);
b.Add(interByte);
}
答案 6 :(得分:0)
这是一个很好的扩展方法,可用于您想要做的事情,但它更安全一些,因为它不会遇到超出范围的问题。
public static IList<T[]> GroupArray<T>(this T[] array, int groupSize)
{
if (array == null)
throw new ArgumentNullException("array");
if (groupSize <= 0)
throw new ArgumentException("Group size must be greater than 0.", "groupSize");
IList<T[]> list = new List<T[]>();
T[] temp = new T[groupSize];
for (int i = 0; i < array.Length; i++)
{
if ((i % groupSize) == 0)
{
temp = new T[groupSize];
list.Add(temp);
}
temp[(i % groupSize)] = array[i];
}
return list;
}
示例使用:
Byte[] myByte = { 1, 2, 3, 4, 4, 2, 3, 4, 2, 5, 3, 4, 4, 2, 6, 3, 4, 5, 3, 3 };
IList<Byte[]> myList = myByte.GroupArray(5);
foreach (var item in myList)
{
Console.Write(item + " ");
foreach (var item2 in item)
{
Console.Write(item2);
}
Console.WriteLine();
}
答案 7 :(得分:0)
byte[] a = {1,2,3,4,4,2,3,4,2,5,3,4,4,2,6,3,4,5,3,3};
List<byte[]> b = new List<byte[]>();
for (int u=0; u<a.Count; u+=5)
{
b.Add(a.Skip(u).Take(5).ToArray());
}