我有一个类Foo
,其中包含一个对象列表:List<Bar>
。每个Bar
都有一个可以根据其排序的属性(类型为TimeSpan
,表示持续时间),并且Bar
是不可变的对象-也就是说,在算法运行期间,持续时间不会改变。目前,对于每个Foo
,我还维护了将其按顺序排列时列表中第一个Bar
(即最短持续时间的Bar
)。大致如下:
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个Foo
的列表,每个Foo
最多有m个Bar
。 这个类一直到现在为止都表现得很好。 我现在希望为用户提供几个选择,这意味着我需要在列表中提供对前几个Bar
的随机访问。
因此,我希望按顺序存储我的Bar
,以便可以按索引顺序访问它们。 在我的Bar
类中,我实现了IComparable
以允许比较Bar
持续时间,但我卡在选择适当数据类型上。 我看了一下System.Collections.SortedList
,但(除非我错了)它似乎参考元素的键,因为它实现了IDictionary
。 我可以使用什么集合来维护我的对象,使它们保持排序,并且可以按索引顺序遍历?
SortedSet
,但请注意它不允许重复项。 - D StanleyAllBars[2]
这样的元素吗?还是只是在使用foreach
时保持元素的顺序即可? - D Stanleyvar sorted = list.OrderBy(_ => _).ToArray()
这样简单的东西不能在此算法之前使用。我们无法在不知道插入次数、列表大小、排序之间调用此算法的频率等情况下建议实现。 - Adam Houldsworth