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
к этому конструктору.