【问题标题】:Collection class that maintains sorted order based on particular property? [duplicate]基于特定属性维护排序顺序的集合类? [复制]
【发布时间】:2011-06-02 08:59:09
【问题描述】:

我正在寻找一个集合类,它会根据属性(即“优先级”)自动按排序顺序插入元素,这样当我稍后迭代它时,我会按此顺序取回元素。


SortedList 似乎是按键排序,这不是我想要的。

【问题讨论】:

  • 你试过 SortedDictionary 了吗? msdn.microsoft.com/en-us/library/f7fta44c.aspx
  • @Harvey:也按关键字排序。我不想要钥匙。
  • 这条语句“SortedList 似乎是按键排序的,这不是我想要的。”你的问题是矛盾的。为了施加任何类型的排序顺序,必须有一个比较函数(因此有一个要比较的键)!也许你想要一个 FIFO 队列?
  • @Mitch:我认为我们在这里混淆了术语。我所说的“键”是指您放在方括号中以检索项目的东西;索引器。我不想要其中的一个,那基本上是一本字典。听起来您指的是排序键...是的,其中一个属性将表现为要排序的“键”,但您将无法检索具有此值的项目。如果有帮助,我正在寻找按value 排序的List
  • 我知道您已经得到了答案,但从您提供的有限信息来看,您似乎需要来自 C5 的 TreeBag<T> 或来自 Power Collections 的 OrderedBag<T>。通过适当的比较器就可以了。看到这个question

标签: c# data-structures


【解决方案1】:

您需要PriorityQueue。你可以在这个类似的问题中找到几个实现:C# Priority Queue

【讨论】:

  • 呵呵...也是我的问题:) 不同的是,这次我不需要区分优先级。
【解决方案2】:

您可以使用 SortedSet<T>,这是 .NET 4 中的新功能。您可以在实现 IComparable<T> 的类上使用它,或者您可以通过构造函数重载提供外部比较器。示例:

class Foo
{
    public int Bar { get; set; }
}

class FooComparer : IComparer<Foo>
{
    public int Compare(Foo x, Foo y)
    {
        // add null checking, demo purposes only
        return x.Bar.CompareTo(y.Bar);
    }
}

...

SortedSet<Foo> sortedFoos = new SortedSet<Foo>(new FooComparer());
sortedFoos.Add(new Foo() { Bar = 2 });
sortedFoos.Add(new Foo() { Bar = 1 });

foreach (Foo foo in sortedFoos)
{
    Console.WriteLine(foo.Bar);
}
// Prints 1, 2

注意:此集合的行为类似于HashSet&lt;T&gt;。如果添加多个比较相等的对象,它们将被丢弃。

【讨论】:

  • 好像是我想要的。如果我在数据类型上实现IComparable,我认为它会使用它?
  • 另外,我假设排序是“稳定的”? -- 如果插入两个比较相等的元素,第一个仍然是集合中的第一个?
  • @Ralph,是的,它会支持IComparable&lt;Foo&gt;。有关更多信息,我将从 MSDN 文档开始。 msdn.microsoft.com/en-us/library/dd412070.aspx
  • @Ralph,小心!看起来这就像HashSet&lt;T&gt;,如果两个项目比较相等,第二个将被丢弃。如果您需要具有相同键属性的多个项目,则可能必须考虑另一种结构。
  • @Anthony:是的......“key”属性将被重复,但作为一个整体的对象应该是唯一的。我想如果它只看比较函数也没关系。
【解决方案3】:

C5 has an IntervalHeap 做我想做的事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2011-12-18
    • 2019-07-02
    • 2011-04-11
    • 2019-07-12
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多