维护排序顺序C#的集合

我有一个类Foo,它包含一个对象列表:List< Bar>.每个栏都有一个可以在其上订购的属性(类型为TimeSpan,表示持续时间),而Bar是一个不可变的对象,即持续时间不会随着算法的运行而改变.目前,对于每个Foo,如果要订单(即最短持续时间的酒吧),我也会维持该列表中的第一名.这样的事情
public class Foo
{
    public List<Bar> AllBars { get; set; }

    public Bar FirstBar { get; set; }

    public Foo (Bar bar)
    {
        FirstBar = bar;

        AllBars = new List<Bar>() { bar };
    }

    public AddBar(Bar bar)
    {
        if(bar.Duration < FirstBar.Duration)
        {
            FirstBar = bar;
        }

        AllBars.Add(bar);
    }
}

这个类Foo用于处理性能(速度)至关重要的算法中.记忆是重要的,但不如速度那么快.有一个n Foos的列表,每个都有m个酒吧.这个课程已经很好,直到这一点.我现在希望为用户提供几种选择,这意味着我需要随机访问列表中的前几个条.

因此,我想按顺序存储我的酒吧,以便我可以按索引访问它们.在我的Bar课程中,我实现了IComparable,允许在持续时间上比较Bars,但是我坚持选择适当的数据类型.我看着System.Collections.sortedList但是(除非我错了),因为它实现了IDictionary,这似乎是通过key来引用元素的.我可以使用什么集合来维护我的对象,使它们保持排序,并且它们可以按索引的顺序遍历?

解决方法

(根据asker的要求从评论中提拔)

如果你可以拥有“值”意味着什么,只需使用SortedList< Bar,对象>在那里你不使用价值部分.

在O(n)时间内添加yourSortedList.Add(yourBar,null)(该列表将必须在所插入的点之后移动“up”所有条目).使用yourSortedList.Keys [i]在O(1)时间内检索第i个条目.

参见SortedList<,>.Keys property documentation的一些“证明”,上面的描述是正确的.请注意,SortedList<,>实际上由“列表”(即,长度容量的阵列,需要时由更大的阵列代替)组成.这与SortedDictionary<,>不同我相信是一个二叉搜索树.

请注意:您将无法在SortedList<,&gt ;,中重复,因此列表中的两个成员不允许以返回值为零进行Compareto.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么