2

リスト内のアイテムを移動しようとしていますが、最後のオプションと比較すると、リンクリストの移動内のアイテムを移動する前に終了します。ノードが最後に配置され、ループしてアイテムを移動できない前に、それを行う方法はありますか?

LinkedList<BD> list = new LinkedList<BD>(b[arg].Values);   
LinkedListNode<BD> node, terminator, next = null;
List<LinkedListNode<BD>> move = new List<LinkedListNode<BD>>();

terminator = list.First;
node = next = list.Last;

while (next != null && next != terminator)
{
    node = next;
    next = next.Previous;
    if (IDs.Contains(node.Value.Id))
    {
        move.Add(node);
        list.Remove(node);
    }
    else
    {
        foreach (var item in move)
        {
            list.AddBefore(node, item);
            node = node.Previous;
        }
        move.Clear();
    }
}
4

3 に答える 3

1

これが私のために働いたものです。私は別のことを試してみて、助けを求めて考えましたが、ここでは、単に前に移動するだけでなく、リストを移動するだけでなく、私にとってうまくいったものがあります:

while (next != null)
{
   node = next;
   next = next.Previous;

   if (IDs.Contains(Id))
   {
      move.Add(node);
      list.Remove(node);
   }
   else
   {
      foreach (var item in move)
      {
         list.AddBefore(node, item);
         node = node.Previous;
      }
      move.Clear(); 
   }

   if (next == null) 
   {
      foreach (var item in move)
      {
         list.AddFirst(item);
      }
      move.Clear();
   }
}
于 2009-07-30T16:28:47.377 に答える
0

このようなもの?(私はあなたのコードに基づいてそれを試みました):

LinkedList<BD> list = new LinkedList<BD>(b[arg].Values);
LinkedListNode<BD> node = list.Last;
LinkedListNode<BD> terminator = null;

while (node != null && node != terminator) {
    if (IDs.Contains(node.Value.DocumentVersionId)) {
        LinkedListNode<BD> tempNode = node;
        node = node.Previous;

        list.Remove(tempNode);
        list.AddFirst(tempNode);
        if (terminator == null) terminator = tempNode;
    } else {
        node = node.Previous;
    }
}

このコードは、「DocumentVersionIdが一致する」ノードをリンクリストの先頭に移動する必要があります。

以下は、それがどのように機能するかを示すための単純な整数の例です。

List<int> specials = new List<int> { 1, 4, 5, 7 };
List<int> source = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
LinkedList<int> list = new LinkedList<int>(source);

LinkedListNode<int> node = list.Last;
LinkedListNode<int> terminator = null;

while (node != null && node != terminator) {
    if (specials.Contains(node.Value)) {
        LinkedListNode<int> tempNode = node;
        node = node.Previous;

        list.Remove(tempNode);
        list.AddFirst(tempNode);
        if (terminator == null) terminator = tempNode;
    } else {
        node = node.Previous;
    }
}

結果のリンクリストには
、1、4、5、7(リンクリストの先頭にあるスペシャル)、2、3、6、8が含まれます。

無限ループは不可能なはずです。

回答の編集:
-ノード=リスト。最初からノード=リスト。最後
-整数を使用した例を追加

于 2009-07-29T22:24:48.287 に答える
0

あなたのコードは 2 つのリストをインターリーブしています。これは私には正しくありません。
繰り返されるブロックの代わりに

foreach (var item in move)
{
    list.AddBefore(node, item);
    node = node.Previous;
}
move.Clear();

あなたはおそらく次のようなものが欲しい

    var before = node.Previous;
    var LinkedListNode<BD> current = null;
    foreach (var item in move)
    {
        list.AddBefore(node, item);
        current = node = item;
    }
    current.Previous = before; // assumes move was not empty
    move.Clear();

挿入している場所を追跡します。

于 2009-07-29T22:11:27.833 に答える