在奇怪的循环上需要逻辑帮助

时间:2011-06-11 08:41:31

标签: c# loops logic run-length-encoding

我正在尝试创建一个循环,它将通过一个字节数组进行递归,然后将它们与数组中的下一个进行比较(可能是使用for循环迭代每个条目)。如果两者相同,我需要它增加一个int变量然后继续。如果两者不相同,则需要将int变量添加到列表后跟其自己的字节值,然后它需要“采用”这个新值作为它自己的值并重新开始整个过程​​,直到数组结束。这是一个非常奇怪的事情,但它需要以这种方式完成,因此我可以按正确的顺序将int / byte对写入文件并使用正确的值。

这里的关注点是获取相同的连续条目数,记下它,然后转到下一个值并重复。例如,如果我们遇到的值3与我们无关的值1相同。只要我们获得值为3的连续条目数,我们就完成了我们的工作。

其他一些可能有用的要点。

  • 在这种情况下,字节值可以跨越整个范围0-255。
  • 数组大小可能高达1.5亿字节条目,因此效率很重要。
  • 预先可以访问数组大小。
  • 最后,字节数组是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 个答案:

答案 0 :(得分: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;
}