【问题标题】:Priority Queue in .Net [duplicate].Net中的优先队列[重复]
【发布时间】:2010-12-10 02:30:31
【问题描述】:

可能重复:
Priority queue in .Net

This question 类似,但我想确切地知道:

.Net 中是否有任何类/结构/... 用于优先级队列?就像在 STL 中有 priority_queue 一样。它接受一个比较函数来支持自定义排序。

我在 .Net 中发现的最好的东西是 SortedList,它按 Key 对其值进行排序。因此,一种解决方案是为 Key 类实现自定义 Compare 接口。但我不能将我的元素分成键/值对。我有必须使用自定义函数根据其值排队的原子元素。

那么,.Net 中是否有任何集合类接受比较函数来对其元素进行排序?

有什么方法可以派生一个支持此功能的 .Net 类(可能是 HashSet)?


注意:

  • 我知道许多第三方为此实现了非常好的类。也许一个很好的例子是PowerCollections。但我想使用 .Net 中的现有类快速简单的解决方案
  • 我正在使用 .Net Framework 3.5

【问题讨论】:

标签: c# .net priority-queue


【解决方案1】:

您可以使用SortedDictionary 类,它是通用的。

您可以为constructor 指定一个比较器对象,它应该处理您的对象的优先级比较:

public class DataComparer : IComparer<Data>
{
    public Int32 Compare(Data a, Data b)
    {
        if (a == null && b == null)
            return 0;
        if (a == null)
            return -1;
        if (b == null)
            return +1;
        return a.Priority.CompareTo(b.Priority);
    }
}

SortedDictionary<Data, Data> priQueue = new SortedDictionary<Data, Data>(
    new DataComparer());

【讨论】:

  • 看来我必须保存我的元素(Data 类)两次。正如我所说,我没有键/值对。我有来自Data 的原子元素和一个Compare 函数/类/...
  • Data 类是否实际上是一个类并不重要,它只是您存储两次的引用。您当然可以将该集合包装在您自己的集合中,为您的需求提供更精简的界面。
  • 感谢 Snippet Lasse,被经理分心了 :)
  • 如果优先级相同,那不会失败吗?
【解决方案2】:

您可以在您的类上实现 IComparable 并在您的类中创建特定的比较器,这样您就可以使用 IList.Sort() 吗?

【讨论】:

  • 此解决方案确实有效,但性能较弱。当我在列表中插入/删除一个元素时,排序列表将被破坏,并且因为 IList.Sort() 它不“智能”,我要做的不仅仅是常规的 priority_queue
  • 在这种情况下,不要使用 IList,而是实现 ICollection,您可以指定自己的 Insert 方法,以便在插入时正确排序。
  • @Ress C - “列表”类的“ICollection”?还是使用另一个类?你能提供一个简单的伪代码吗?非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多