【发布时间】:2016-03-03 08:53:36
【问题描述】:
根据它们的值按特定顺序对BlockingCollection<T> 中的项目进行排序的最佳方法是什么。我知道有一个OrderBy的方法,可以用来实现排序吗?
【问题讨论】:
-
为什么需要排序?
-
@Dennis 我需要根据参数对队列进行排序,所以它不是先到先得!
标签: c# .net blockingcollection
根据它们的值按特定顺序对BlockingCollection<T> 中的项目进行排序的最佳方法是什么。我知道有一个OrderBy的方法,可以用来实现排序吗?
【问题讨论】:
标签: c# .net blockingcollection
听起来您需要根据一些比较标准对队列中的项目进行排序。这基本上是一个Priority Queue。
有一种方法可以使用带有BlockingCollection<T> 的优先级队列。您必须编写一个实现IProducerConsumerCollection 的Priority Queue,并将该队列的一个实例传递给适当的BlockingCollection 构造函数。
幸运的是,微软提供了sample code that demonstrates how to do this。它还包括一个简单优先级队列的源代码。
还有许多其他的优先级队列实现在线可用,for example here。但是,您必须修改它们以实现 IProducerConsumerCollection,这不太可能是一项微不足道的任务。
[编辑] 我找到了concurrent priority queue that implements IProducerConsumerCollection - 你应该可以使用它。
【讨论】:
查看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
*/
【讨论】:
BlockingCollection<T> 是一个 concurrent 集合,用于解决生产者-消费者任务。任何线程都可以以线程安全的方式对其进行修改。重新排序集合,重新分配集合至少会导致数据丢失。