2016-03-03 30 views
0

根据特定顺序的值排序BlockingCollection<T>中的项目的最佳方法是什么?我知道有一个OrderBy方法,它可以用来实现排序吗?Sorting/Ordering a BlockingCollecion

+0

为什么你需要对它进行排序? – Dennis

+1

@丹尼斯我需要根据参数对队列进行排序,因此它不是先到先得! –

+1

http://stackoverflow.com/questions/4016509/concurrent-priority-queue-in-net-4-0 –

回答

-1

入住这https://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx

从MSDN:

class Pet 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public static void OrderByEx1() 
{ 
    Pet[] pets = { new Pet { Name="Barley", Age=8 }, 
        new Pet { Name="Boots", Age=4 }, 
        new Pet { Name="Whiskers", Age=1 } }; 

    IEnumerable<Pet> query = pets.OrderBy(pet => pet.Age); 

    foreach (Pet pet in query) 
    { 
     Console.WriteLine("{0} - {1}", pet.Name, pet.Age); 
    } 
} 

/* 
This code produces the following output: 

Whiskers - 1 
Boots - 4 
Barley - 8 
*/ 
+0

这将排序收集快照,而不是一个集合本身。看起来OP想要一些优先权,所以继续收集项目。 – Dennis

+0

无法将有序集合设置为源? – Caesar

+0

'BlockingCollection '是解决生产者 - 消费者任务的* concurrent *集合。任何线程都可以以线程安全的方式进行修改。重新排序收集,重新分配收集至少会导致数据丢失。 – Dennis

2

这听起来像你需要根据一些比较标准的队列订购的项目。这基本上是一个Priority Queue

有一种方法可以使用BlockingCollection<T>的优先级队列。您必须编写一个实现IProducerConsumerCollectionPriority Queue,并将该队列的实例传递给适当的BlockingCollection构造函数。

幸运的是,微软提供了sample code that demonstrates how to do this。它还包含简单优先级队列的源代码。

在线上有很多其他的优先级队列实现可用,for example here。但是,你必须修改它们来实现IProducerConsumerCollection,这不太可能是一件小事。

[编辑]我发现一个concurrent priority queue that implements IProducerConsumerCollection - 你应该可以使用它。

+0

该链接对于并发优先级队列不起作用。 –

相关问题