保持排序的元素列表,按该元素外部的属性排序

时间:2010-01-12 04:13:40

标签: c# list abstract

我有一个“经理”类维护一个对象列表。每个对象都有一定的“位置”,但这对他们来说并不为人所知,只有经理知道这一点。管理者必须为每个对象分配一个位置,并维护根据此“外部属性”排序的对象列表。

请注意,Object的位置可以随时更改。理想情况下,我应该能够在任何时候立即获得位置X处的元素或元素X的位置。

这是C#代码。我想知道这样做会是一种干净或惯用的方式。

我想过制作一个像这样的内部课程:

class SortedElement {
    public Element Elem { get; set; }
    public int Position { get; set; }
}

然后维护SortedElements列表。我不知道,这对我来说似乎很笨拙。例如,两个SortedElements可以具有相同的位置。我觉得有一个明显的,干净的解决方案,我很想念。我也可以将“位置”作为元素本身的属性,但它在语义上没有意义,这意味着除了让我的生活更轻松之外,他们没有理由知道这一点。

请让我去 facepalm

编辑:按照Eric Lippert建议列出我的要求,睡个好觉,我意识到我应该选择LinkedList<Element>并使用索引作为位置。实际上,这里最常见的操作是在开始时插入并移除容器内的任何位置,这在基于阵列的容器上是昂贵的。 感谢所有回复。

4 个答案:

答案 0 :(得分:2)

让我们列出您的要求。我假设你想要一个具有以下操作的数据结构S:

  • ContainsElement:接受一个元素,告诉您该元素是否在S
  • IsValidPosition:获取一个位置,告诉您该位置是否在S
  • 中可用
  • GetElementAt:获取有效位置,返回元素
  • GetPositionOf:获取S中的Element,返回Position
  • InsertElementAt:获取不在S中的元素和有效位置。将元素放在该位置; 之后的所有元素该位置“向上移动”。
  • RemoveElementAt:获取有效位置,移除该位置的元素,该位置后的所有元素都“向下移动”。

这是您想要的操作的正确摘要吗? (请注意,将元素移动到新位置与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