gpt4 book ai didi

c# - 并发堆栈 : How to check if contains object?

转载 作者:行者123 更新时间:2023-11-30 14:21:55 24 4
gpt4 key购买 nike

如何检查堆栈中是否包含特定对象?

private ConcurrentStack<int> cs = new ConcurrentStack<int>();
cs.Push(1);

最佳答案

方法 Stack<T>.Contains ConcurrentStack<T> -class 中不可用.我猜是因为那不是线程安全的。

所以如果你需要它,你必须使用锁,然后你可以使用 Enumerable.Contains :

private ConcurrentStack<int> cs = new ConcurrentStack<int>();
private Object csLockObject = new Object();

...

bool contains = false;
lock (csLockObject)
{
contains = cs.Contains(1);
}

但是当您枚举此快照时,另一个线程可能会向堆栈添加或从堆栈中删除项目。如果您想防止这种情况发生,您还需要在添加/删除的地方加一把锁。

I want to avoid duplicates

好吧,您可以使用像这样的类,它使用 ConcurrentDictionary检查它是否唯一:

public class ConcurrentUniqueStack<T>
{
private readonly ConcurrentDictionary<T, int> _itemUnique; // there is no ConcurrentHashSet so we need to use a Key-only dictionary
private readonly ConcurrentStack<T> _stack;

public ConcurrentUniqueStack() : this(EqualityComparer<T>.Default)
{
}
public ConcurrentUniqueStack(IEqualityComparer<T> comparer)
{
_stack = new ConcurrentStack<T>();
_itemUnique = new ConcurrentDictionary<T, int>(comparer);
}

public bool TryPush(T item)
{
bool unique = _itemUnique.TryAdd(item, 1);
if (unique)
{
_stack.Push(item);
}

return unique;
}
public bool TryPop(out T result)
{
bool couldBeRemoved = _stack.TryPop(out result);
if (couldBeRemoved)
{
_itemUnique.TryRemove(result, out int whatever);
}
return couldBeRemoved;
}

public bool TryPeek(out T result) => _stack.TryPeek(out result);
}

关于c# - 并发堆栈 : How to check if contains object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52535208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com