我有一个类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<,> ;,中重复,因此列表中的两个成员不允许以返回值为零进行CompareTo.