我有一个“经理”类维护一个对象列表。每个对象都有一定的“位置”,但这对他们来说并不为人所知,只有经理知道这一点。管理者必须为每个对象分配一个位置,并维护根据此“外部属性”排序的对象列表。
请注意,Object的位置可以随时更改。理想情况下,我应该能够在任何时候立即获得位置X处的元素或元素X的位置。
这是C#代码。我想知道这样做会是一种干净或惯用的方式。
我想过制作一个像这样的内部课程:
class SortedElement {
public Element Elem { get; set; }
public int Position { get; set; }
}
然后维护SortedElements列表。我不知道,这对我来说似乎很笨拙。例如,两个SortedElements可以具有相同的位置。我觉得有一个明显的,干净的解决方案,我很想念。我也可以将“位置”作为元素本身的属性,但它在语义上没有意义,这意味着除了让我的生活更轻松之外,他们没有理由知道这一点。
请让我去 facepalm 。
编辑:按照Eric Lippert建议列出我的要求,睡个好觉,我意识到我应该选择LinkedList<Element>
并使用索引作为位置。实际上,这里最常见的操作是在开始时插入并移除容器内的任何位置,这在基于阵列的容器上是昂贵的。
感谢所有回复。
答案 0 :(得分:2)
让我们列出您的要求。我假设你想要一个具有以下操作的数据结构S:
这是您想要的操作的正确摘要吗? (请注意,将元素移动到新位置与RemoveElementAt后跟InsertElementAt相同。)
如果这些不是操作的正确摘要,那么如果您准确列出希望抽象数据类型支持的操作集,将会很有帮助。
一旦我们有明确的运营要求清单,那么下一个问题是“渐进性能要求是什么?”
例如,您可以使用List<T>
作为数据结构S;它支持所有这些操作。但是,如果列表很长,那么在列表开头插入和删除非常昂贵,就像“包含”操作一样。
您可以使用更多异国情调的数据结构,这些数据结构在插入和删除建模方面非常高效;我们使用这样的数据结构来模拟C#IDE中编辑器状态的更改。显然,每个令牌,变量声明等都是一个“元素”,它具有“位置”,并且当您在其周围键入时,该位置会一直变化;以有效的方式处理这些变化是非常具有挑战性的,但如果这就是你所处的问题空间,那么就更清楚地描述它,我们可以给你指出你可以做一些研究的数据结构。
答案 1 :(得分:1)
你似乎在努力避免将集合描述为一个简单的元素序列,所以我假设List<T>
并使用索引作为位置是不可能的。怎么样Dictionary<int, Element>
?它强制执行唯一性并假设您所指的这个“位置”是序数,保持适当的排序。
答案 2 :(得分:0)
您可以使用通用列表(List<Element>
)在内部维护“manager”类的元素列表。然后,您可以使用Sort()
类的List<T>
方法对列表进行排序。例如:
myList.Sort((elem1, elem2) => elem1.Name.CompareTo(elem2.Name));
在此示例中,元素按属性“Name”排序,但您可以在比较中使用任何内容,包括“外部属性”。
答案 3 :(得分:0)
我认为你应该使用SortedDictionary。