Нужна помощь с логикой в странном цикле
Я пытаюсь создать цикл, который будет проходить через массив байтов и сравнивать их со следующим в массиве (предположительно, используя цикл for для итерации каждой записи). Если они совпадают, мне нужно увеличить значение переменной int, а затем продолжить. Если они не совпадают, необходимо добавить переменную int в список, за которым следует собственное значение байта, а затем ему нужно "принять" это новое значение как собственное и начать все заново до конца массива. Это очень странная вещь, но это нужно сделать таким образом, чтобы я мог записать пары int / byte в файл в правильном порядке и с правильными значениями.
Задача здесь состоит в том, чтобы получить количество последовательных записей, которые являются одинаковыми, запишите это, затем перейдите к следующему значению и повторите. Если, например, значение 3, с которым мы сталкиваемся, совпадает со значением 1, это нас не касается. Пока мы получим количество последовательных записей для значения 3, мы выполнили свою работу.
Пара других, возможно, полезных моментов.
- В этом случае значения байтов могут охватывать весь диапазон 0-255.
- Размер массива может составлять до 150 миллионов байтов, поэтому важна эффективность.
- Размер массива доступен заранее.
- Наконец, байтовый массив является байтовой переменной в Struct.
Я надеюсь, что это имеет смысл. Заранее спасибо.
РЕДАКТИРОВАТЬ: Извините, если я не совсем ясно, и, возможно, я должен переименовать вопрос также.
Чтобы уточнить, я понимаю, что мне нужно сделать здесь, но не как это сделать. Так что вопрос, который я думаю, заключается в том, как мне пройтись по этому сравнению, а затем поменять то, что я сравниваю, когда я получаю ложный возврат. Самое главное, как мне это сделать, когда то, что я сравниваю, может иметь 255 значений, и я не знаю о них. Я не могу представить, как это закодировать, поэтому я просто продолжаю сидеть и пялиться на VS:)
Это имеет смысл? Если не извиняюсь:)
РЕДАКТИРОВАТЬ 2: Вот конечный результат, который я придумал, если кто-то хочет посмотреть на него. Это было вдохновлено кодом aligray внизу.
int count = 0;
byte previous = tiles[0].TileTypeId;
List<int> typeCount = new List<int>();
List<byte> type = new List<byte>();
for (int i = 0; i < worldSize; i++)
{
byte current = tiles[i].TileTypeId;
if (previous == current)
{
count++;
}
else
{
typeCount.Add(count);
type.Add(previous);
previous = current;
count = 1;
}
}
1 ответ
Если я правильно понял вопрос, надеюсь, это поможет вам начать:
int count = 0;
byte previous = byteArray[0];
List<int> list = new List<int>();
for (int i = 1; i < byteArray.Length; i++)
{
byte current = byteArray[i];
if (previous == current)
{
count++;
}
else
{
list.Add(count);
list.Add(Convert.ToInt32(current));
}
previous = current;
}