0

リンクリストの容量を持つ配列を作成する必要があります。

基本的に、静的インデックスベースのリスト(配列など)が必要ですが、次と前のフィールドを取得する可能性があります(リンクリストのように、リストを簡単にループバックおよびフォワードします)。 注:配列は2次元です。配列値としてカスタムクラスを使用します。したがって、インスタンスごとに前のプロパティと次のプロパティを設定できます。

このための組み込みのC#コレクションはありますか?そうでない場合は、これの非常に単純なバージョンを作成する方法についての提案はありますか?(私はすでに2つのメソッドで構成されるこのバージョンを持っています。1つは前のフィールドを設定するために前方にループし、もう1つは次のフィールドを設定するために後方にループしますが、それでも厄介です)。

前もって感謝します

編集:

問題は、2次元配列の使用です。配列をループする場合:

            for (byte x = 0; x < Grid.GetLength(0); x++) 
            {
                for (byte y = 0; y < Grid.GetLength(1); y++) /
                {
                    //At certain point, I need to get the previous field. I can do:
                    if (y != 0)
                    {
                        y -= 2; //-2 because I will y++ in for. Already getting messy
                    }
                    else 
                    {
//What if y == 0? Then I can't do y--. I should get max y and  do x-- to get previous element:

                        y = (byte)(Grid.GetLength(1) - 1); //to get max value y

                        x--;
                    }
}
    }
4

2 に答える 2

4

組み込みのLinkedList<T>クラスがあります。

しかし、あなたの説明から、なぜ配列が機能しないのでしょうか?静的でインデックスベースであり、インデックスをインクリメント/デクリメントすることで、次の要素と前の要素を簡単に取得できます。コードから必要なものを正確に把握するのは難しいですが、次の方法で多次元配列を簡単に列挙できることを指摘しておきます。

var arry = new int[2,3];
foreach(var item in arry)
{
    ...
}

したがって、これを構造と組み合わせることができる場合がありますStack<T>(スタック上のアイテムをプッシュし、それらをポップして前のものを取得します)。

または、配列をLinkedList直接に変換することもできます。

var list = new LinkedList(arry.Cast<int>()); // flattens array

または、元の配列のインデックスを保持し、リンクリストとして値をループする場合は、次を使用します。

var list = new LinkedList(arry.Cast<int>.Select((item, i) => new 
{ 
    Item = item, 
    Index1 = i % arry.GetLength(1), 
    Index2 = i / arry.GetLength(0) 
}));
var node = list.First;
while(node.Next != null)
{
    Console.WriteLine("Value @ {1}, {2}: {0}", node.Value.Item, node.Value.Index1, node.Value.Index2);
    // on some condition move to previous node
    if (...)
    {
        node = node.Previous;
    }
    else
    {
        node = node.Next;
    }
}
于 2013-03-11T19:49:16.990 に答える
2

いいえ、しません。「スマートリンクノード配列」の代わりに従来の配列を放棄するのではなく、ループ本体にいくつかの変数を追加してみてください。

byte x_len = Grid.GetLength(0);
byte y_len = Grid.GetLength(1);
byte prev_x, next_x, prev_y, next_y;

for (byte x = 0; x < x_len; ++x) 
{
  prev_x = x == 0? x_len - 1 : x - 1;
  next_x = x == x_len - 1? 0 : x + 1;
  for (byte y = 0; y < y_len; ++y)
  {
    prev_y = y == 0? y_len - 1 : y - 1;
    next_y = y == y_len - 1? 0 : y + 1;

    // here, you have access to the next and previous
    // in both directions, satisfying your requirements
    // without confusing your loop variables.

  }
}
于 2013-03-11T20:17:26.777 に答える