2009-07-29 49 views
2

我试图移动列表中的项目,但是当我比较最后一个选项时,我退出之前移动移动链接列表中的项目。有没有办法做到这一点,节点被放在最后,并不能循环移动项目?在链接列表中移动项目C#.NET

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(); 
    } 
} 
+1

请编辑您的问题,选择的代码部分,然后按小编辑器上方的“编码”按钮。这使得代码更易于阅读。 – Zyphrax 2009-07-29 21:51:04

+0

@Zyphrax:为他们做到了。 – 2009-07-29 21:51:24

+0

@ Bruce227:你能否描述一下你想要完成的事情?你是否想要分析节点,检查节点的DocumentVersionId是否在ID列表中,然后将该节点移动到链表的最前端? – Zyphrax 2009-07-29 22:05:56

回答

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(); 
    } 
} 
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(); 

跟踪你插入其中。

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

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

答案编辑:
- 节点= list.First节点= list.Last
- 添加整数