【问题标题】:Sorting/Ordering a BlockingCollecion对 BlockingCollection 进行排序/排序
【发布时间】:2016-03-03 08:53:36
【问题描述】:

根据它们的值按特定顺序对BlockingCollection<T> 中的项目进行排序的最佳方法是什么。我知道有一个OrderBy的方法,可以用来实现排序吗?

【问题讨论】:

标签: c# .net blockingcollection


【解决方案1】:

听起来您需要根据一些比较标准对队列中的项目进行排序。这基本上是一个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 - 你应该可以使用它。

【讨论】:

  • 该链接不适用于并发优先级队列。
【解决方案2】:

查看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
*/

【讨论】:

  • 这将排序集合快照,而不是集合本身。看起来 OP 想要一些优先权,所以继续收集项目。
  • 无法将有序集合设置为源?
  • BlockingCollection&lt;T&gt; 是一个 concurrent 集合,用于解决生产者-消费者任务。任何线程都可以以线程安全的方式对其进行修改。重新排序集合,重新分配集合至少会导致数据丢失。
  • @Dennis 在这种情况下你建议 Dennis 做什么?
  • @TimeMachine: 优先队列是你所需要的。你已经有很多链接和答案了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多