Нужна помощь с логикой в ​​странном цикле - PullRequest
1 голос
/ 11 июня 2011

Я пытаюсь создать цикл, который будет проходить через массив байтов и сравнивать их со следующим в массиве (предположительно, используя цикл 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 Ответ

1 голос
/ 11 июня 2011

Если я правильно понял вопрос, надеюсь, это поможет вам начать:

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