2009-07-29 46 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
- 添加整數