Нужна помощь с логикой на странной петле
-
26-10-2019 - |
Вопрос
Я пытаюсь сделать петлю, которая будет повторяться через массив байтов, и сравнить их с следующим в массиве (предположительно, используя цикл для итерации через каждую запись). Если они одинаковы, мне нужно, чтобы она увеличила переменную int, а затем продолжить. Если эти два не совпадают, им нужно добавить переменную int в список, за которым следует собственное значение байта, а затем ей нужно «принять» это новое значение в качестве своего собственного и запустить все это снова до конца массива. Это очень странная вещь, но это должно быть сделано таким образом, чтобы я мог написать пары Int/Byte в файл в правильном порядке и с правильными значениями.
Здесь проблема состоит в том, чтобы получить количество последовательных записей, которые одинаковы, отметьте это, затем перейти к следующему значению и повторите. Если, например, значение 3, с которым мы сталкиваемся, то же самое, что и значение 1, это не представляет для нас беспокойства. Пока мы получаем количество последовательных записей для стоимости 3, мы выполнили нашу работу.
Пара других, возможно, полезных моментов.
- Значения байта в этом случае могут охватывать весь диапазон 0-255.
- Размер массива может составлять до 150 миллионов байтовых записей, поэтому важна эффективность.
- Размер массива доступен заранее.
- Наконец, массив байтов является переменной байта в структуре.
Я надеюсь, что это имеет смысл. Заранее спасибо.
РЕДАКТИРОВАТЬ: Извините, если я не был совершенно ясен раньше, и, возможно, мне также следует повторно набрать вопрос.
Чтобы уточнить, я понимаю, что мне нужно здесь делать, просто не как это сделать. Поэтому, я думаю, вопрос будет в том, как мне пройти через это сравнение, а затем поменять то, что я сравниваю, когда получаю ложную прибыль. Самое главное, как мне это сделать, когда то, что я сравниваю, может иметь 255 значений, и я не знаю о них. Я не могу представить, как это кодировать, поэтому я просто сижу там, уставившись на VS :)
Это имеет смысл? Если нет, я прошу прощения :)
РЕДАКТИРОВАТЬ 2: Вот конечный результат, который я придумал, если кто -нибудь хочет посмотреть на него. Он был вдохновлен кодом Алиграй внизу.
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;
}
}
Решение
Если я правильно понял вопрос, надеюсь, это начнет вас:
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;
}