2013-07-03 91 views
0

我有一個問題,我需要有一個選項卡控件來實現:堆棧與AddUniqueItem

每一個標籤被選中的時候,Stack.Push();取消選擇的選項卡。當用戶關閉選定的選項卡時,轉到由Stack.Pop();等返回的選項卡。當選中另一個標籤時,只需Stack.Pop();

我目前使用一個Stack,其中包含所有取消選中的選項卡。我想要的是能夠刪除堆棧中推送選項卡的所有現有副本,然後繼續執行實際的Stack.Push() Stack描述的行爲是否可能,知道它不支持隨機訪問?

+1

堆棧是LIFO,因此您只能訪問頂層元素。您可能需要使用列表 – Liam

+0

列表中不包含Pop()和Push()。我希望有一個優雅的解決方案,List是我的最後選擇。 –

+2

即使有一個列表,搜索整個東西的重複,然後刪除它們都是一個相當低效的操作。 – Servy

回答

1

是的,這是可能的,你只需要刪除,然後重新添加堆棧中的所有項目。

public static void PushUnique<T>(this Stack<T> stack, T item 
    , IEqualityComparer<T> comparer = null) 
{ 
    comparer = comparer ?? EqualityComparer<T>.Default; 
    var otherStack = new Stack<T>(); 
    while (stack.Any()) 
    { 
     var next = stack.Pop(); 
     if (!comparer.Equals(next, item)) 
      otherStack.Push(next); 
    } 

    foreach (var next in otherStack) 
     stack.Push(next); 
    stack.Push(item); 
} 
+0

我在寫這篇評論時,實際上是在試圖實現它。感謝您花時間幫助我,它效果很好。 –

+0

@ Francis.Beauchamp明白你完全在每次添加時重建堆棧(不管是什麼),這是昂貴的,所以這不應該用於非平凡大小的集合。 – Servy

+0

我的選項卡控件永遠不會有多於一個選項卡的功能,大約是20。 –