在自定义ConcurrentHashSet类上使用LINQ方法?

时间:2017-12-02 08:08:44

标签: c# .net collections

最近我从HashSet切换到其他人发布的名为'ConcurrentHashSet'的集合,我决定选择不再锁定我自己的HashSet,因为我使用它很多,而且使用预制线程似乎更安全的赌注 - 安全的课程,但我遇到了一个问题。

当我使用HashSet(默认的HashSet类)时,我使用Export-PackageFirst方法得到了我的HashSet值,问题是我不能再使用这些方法而且我不确定为什么或如何重新实施它们,甚至可能吗?这可能很简单,我不确定。

我希望有人会知道并且可以指出我正确的方向。这是我从另一个stack overflow answer获得的课程,虽然我不确定这是否是原作。

FirstOrDefault

1 个答案:

答案 0 :(得分:2)

您发布的自定义类在内部使用HashSet<T>来存储数据。因此,您仍然可以使用您提到的方法,FirstFirstOrDefault,只要您将以线程安全的方式执行此操作。例如,FirstOrDefault的实现可能是这样的:

public T TryGetFirstOrDefault()
{
    _lock.EnterReadLock();

    try
    {
        return _hashSet.FirstOrDefault();
    }
    finally
    {
        if (_lock.IsReadLockHeld) _lock.ExitReadLock();
    }
}

<强>更新

您可以通过传递谓词来概括上述内容:

public T TryGetFirstOrDefault(Func<T, bool> predicate)
{
    _lock.EnterReadLock();

    try
    {
        return _hashSet.FirstOrDefault(x=>predicate(x));
    }
    finally
    {
        if (_lock.IsReadLockHeld) _lock.ExitReadLock();
    }
}

因此,如果你有ConcurrentHashSet<Player>,你可以使用它作为:

var player = concurrentHashSetOfPlayers.TryGetFirstOrDefault(x=>x.Id == playerId);