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

您的代码将两个列表交错 - 这对我来说看起来不正确。
我认为,而不是重复的块

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 回答
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-matched”节点移动到链接列表的前面。

下面是一个使用简单整数的示例来演示它是如何工作的:

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

无限循环应该是不可能的。

回答编辑:
- node = list.Firstnode = list.Last
- 添加了一个整数示例

于 2009-07-29T22:24:48.287 回答