我有一個問題,我需要有一個選項卡控件來實現:堆棧與AddUniqueItem
每一個標籤被選中的時候,Stack.Push();
取消選擇的選項卡。當用戶關閉選定的選項卡時,轉到由Stack.Pop();
等返回的選項卡。當選中另一個標籤時,只需Stack.Pop();
。
我目前使用一個Stack
,其中包含所有取消選中的選項卡。我想要的是能夠刪除堆棧中推送選項卡的所有現有副本,然後繼續執行實際的Stack.Push()
。 Stack描述的行爲是否可能,知道它不支持隨機訪問?
我有一個問題,我需要有一個選項卡控件來實現:堆棧與AddUniqueItem
每一個標籤被選中的時候,Stack.Push();
取消選擇的選項卡。當用戶關閉選定的選項卡時,轉到由Stack.Pop();
等返回的選項卡。當選中另一個標籤時,只需Stack.Pop();
。
我目前使用一個Stack
,其中包含所有取消選中的選項卡。我想要的是能夠刪除堆棧中推送選項卡的所有現有副本,然後繼續執行實際的Stack.Push()
。 Stack描述的行爲是否可能,知道它不支持隨機訪問?
是的,這是可能的,你只需要刪除,然後重新添加堆棧中的所有項目。
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);
}
我在寫這篇評論時,實際上是在試圖實現它。感謝您花時間幫助我,它效果很好。 –
@ Francis.Beauchamp明白你完全在每次添加時重建堆棧(不管是什麼),這是昂貴的,所以這不應該用於非平凡大小的集合。 – Servy
我的選項卡控件永遠不會有多於一個選項卡的功能,大約是20。 –
堆棧是LIFO,因此您只能訪問頂層元素。您可能需要使用列表 – Liam
列表中不包含Pop()和Push()。我希望有一個優雅的解決方案,List是我的最後選擇。 –
即使有一個列表,搜索整個東西的重複,然後刪除它們都是一個相當低效的操作。 – Servy