Blocking Concurrent Collection - метод Take, который принимает элемент, поддерживающий условие

Я хотел бы иметь параллельную коллекцию, которая поддерживает блокировку потока Take операции, в то время как фактический взятый предмет является предметом, который удовлетворяет условию.

Что-то вроде:

private TheBlockingCollection<MyClass> _myCollection;

MyClass myItem = _myCollection.TakeItemWhere(item => item.Type.equals(something));

Конечная цель - получить элемент с наибольшим значением свойства, которое в данный момент существует в коллекции. например - Макс

Есть ли такая встроенная коллекция?

Если нет, что будет лучшей альтернативой?

1 ответ

Решение

Как упоминает Servy в комментарии выше, вы должны использовать приоритетную очередь с BlockingCollection.

Если вы реализуете соответствующий IComparable<> интерфейс для типов, хранящихся в коллекции, тогда, когда вы удаляете элементы из очереди, вы автоматически получаете элемент, который является первым в соответствии с заданным вами интерфейсом сравнения.

Microsoft предоставил образецConcurrentPriorityQueue который реализует IProducerConsumerCollection что вы можете использовать с BlockingCollection.

Вы используете его, сначала создав экземпляр ConcurrentPriorityQueue а затем путем создания BlockingCollection с помощью одного из конструкторов, который принимает IProducerConsumerCollection<T>Например: http://msdn.microsoft.com/en-us/library/dd287133.aspx

Вам просто нужно передать ConcurrentPriortyQueue к этому конструктору.

Другие вопросы по тегам