バイトの配列を再帰的に処理し、それらを配列内の次のバイトと比較するループを作成しようとしています(おそらく、forループを使用して各エントリを反復処理します)。2つが同じである場合は、int変数をインクリメントして続行する必要があります。2つが同じでない場合は、int変数をリストに追加し、その後に独自のバイト値を追加する必要があります。次に、この新しい値を独自のものとして「採用」し、配列の最後まですべてを最初からやり直す必要があります。これは非常に奇妙なことですが、int / byteペアを正しい順序で正しい値でファイルに書き込むことができるように、この方法で行う必要があります。
ここでの懸念は、同じである連続したエントリの数を取得し、それをメモしてから、次の値に移動して繰り返すことです。たとえば、私たちが遭遇する値3が値1と同じである場合、それは私たちには関係ありません。値3の連続したエントリの数を取得する限り、作業は完了しました。
他のいくつかのおそらく役立つポイント。
- この場合、バイト値は0〜255の全範囲に及ぶ可能性があります。
- 配列サイズは最大1億5000万バイトのエントリである可能性があるため、効率が重要です。
- 配列サイズは事前にアクセス可能です。
- 最後に、バイト配列は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;
}
}