从bytearray中删除特定的索引范围,然后重新组合c#
我有一个要求,我在bytearray中有大量的数据。我想选择39998数据并跳过39999,40000.40001,40002索引,然后再选择这个39998数据并跳过39999,40000.40001,40002。从bytearray中删除特定的索引范围,然后重新组合c#
所以我的要求是, 我需要大小的总字节数组39998 * 12 = 479976
我曾尝试这种解决方案
for (int i = 1; i < 13; i++)
{
list.RemoveAt(39999 * i);
list.RemoveAt((39999 * i) + 1);
list.RemoveAt((39999 * i) + 2);
list.RemoveAt((39999 * i) + 3);
}
但是却将列表。
我需要选择数据从1到39998跳过4个字节,然后选择39998并跳过4个字节等等直到12次。然后重新组合bytearray。实际上,如果我们正在使用列表,它会在第二次移动索引时发生问题(删除其他索引)。所以如果其他建议你请让我知道
这是行不通的吗?
for (int i = 12; i > 0; i--)
{
list.RemoveAt((39999 * i) + 3);
list.RemoveAt((39999 * i) + 2);
list.RemoveAt((39999 * i) + 1);
list.RemoveAt(39999 * i);
}
嗨@Graham Bytearray大小是动态的,我有一个需求,我需要从1到39998选择数据跳过4个字节,然后选择39998并跳过4个字节等等直到12次。 然后重新组合bytearray。实际上,如果我们正在使用列表,它会在第二次移动索引时发生问题(删除其他索引)。 所以,如果你有其他建议,请让我知道。 –
在这种情况下,我恐怕不清楚你想要什么。也许'array.Where((x,i)=> i%40002 Graham
如果我正确地理解了这个问题,会是这样的工作吗?
int iterations = 12;
var newList = new List<byte>();
for(int i = 0; i < iterations; i++)
{
newList.AddRange(list.Skip(40002 * i).Take(39998));
}
var result = newList.ToArray();
如何像:
int take = 39998;
int skip = 4;
int iterationBatch = take + skip;
int finalAmount = take * 12;
var yourNewArray = yourOldArray
.GroupBatch(iterationBatch)
.SelectMany(x => x.Take(take))
.Take(finalAmount)
.ToArray();
使用扩展方法看起来像:
public static IEnumerable<IEnumerable<T>> GroupBatch<T>(this IEnumerable<T> enumerable, int batchSize)
{
int count = enumerable.Count();
for (int taken = 0; taken < count ; taken += batchSize)
{
yield return enumerable.Skip(taken).Take(batchSize);
}
}
我没有测试它彻底,虽然,但你得到它的总体思路...
我想你应该在13开始'i'并减1,这样你的偏移就不会受到前面循环中的移除的影响。 – juharr
我有一个需求,我需要从1到39998选择数据跳过4个字节,然后选择39998并跳过4个字节等等,直到12次。然后重新组合bytearray。实际上,如果我们正在使用列表,它会在第二次移动索引时发生问题(删除其他索引)。所以,如果你有其他建议,请让我知道 –
我想你可以减去4次'我 - 1'来说明前面循环中删除的项目。 – juharr