2015-12-16 29 views
1

我有一个要求,我在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。实际上,如果我们正在使用列表,它会在第二次移动索引时发生问题(删除其他索引)。所以如果其他建议你请让我知道

+0

我想你应该在13开始'i'并减1,这样你的偏移就不会受到前面循环中的移除的影响。 – juharr

+0

我有一个需求,我需要从1到39998选择数据跳过4个字节,然后选择39998并跳过4个字节等等,直到12次。然后重新组合bytearray。实际上,如果我们正在使用列表,它会在第二次移动索引时发生问题(删除其他索引)。所以,如果你有其他建议,请让我知道 –

+0

我想你可以减去4次'我 - 1'来说明前面循环中删除的项目。 – juharr

回答

0

这是行不通的吗?

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); 
} 
+0

嗨@Graham Bytearray大小是动态的,我有一个需求,我需要从1到39998选择数据跳过4个字节,然后选择39998并跳过4个字节等等直到12次。 然后重新组合bytearray。实际上,如果我们正在使用列表,它会在第二次移动索引时发生问题(删除其他索引)。 所以,如果你有其他建议,请让我知道。 –

+0

在这种情况下,我恐怕不清楚你想要什么。也许'array.Where((x,i)=> i%40002 <39998).ToArray()'允许不同大小的数组? – Graham

0

如果我正确地理解了这个问题,会是这样的工作吗?

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(); 
0

如何像:

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

我没有测试它彻底,虽然,但你得到它的总体思路...