1

我有一个要求,我在 bytearray 中有大量数据。我想选择 39998 数据并跳过 39999,40000.40001,40002 索引,然后在此 39998 数据之后再次选择并跳过 39999,40000.40001,40002。

所以我的要求是我需要大小为 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 次。然后重新组合字节数组。实际上,如果我们使用列表,它会在第二次移动索引它会出现问题(删除另一个索引)。所以如果你有其他建议,请告诉我

4

3 回答 3

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();
于 2015-12-16T17:37:50.980 回答
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);
}
于 2015-12-16T16:09:51.640 回答
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);
    }
}

虽然我没有彻底测试过它,但你对它有大致的了解......

于 2015-12-16T20:13:55.823 回答