具有AddUniqueItem的堆栈

本文关键字:堆栈 AddUniqueItem 具有 | 更新日期: 2023-09-27 18:20:57

我有一个需要用Tab控件实现的行为:

每次选择选项卡时,Stack.Push();即为取消选择的选项卡。当用户关闭所选选项卡时,转到Stack.Pop();返回的选项卡,依此类推。当选择的选项卡之外的其他选项卡时,只需Stack.Pop();

我目前使用的Stack包含所有取消选择的选项卡。我想要的是功能,可以删除堆栈中Pushed选项卡的所有现有副本,然后转到实际的Stack.Push()在知道Stack不支持随机访问的情况下,它是否可以实现所描述的行为?

具有AddUniqueItem的堆栈

是的,这是可能的,您只需要删除然后重新添加堆栈中的所有项。

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