C# 搜索正确的数据结构(添加标头、交换、删除等)

C# 搜索正确的数据结构(添加标头、交换、删除等),c#,data-structures,C#,Data Structures,我正在搜索提供以下功能的数据结构: 在前面添加一个元素 交换两个元素 删除元素 当我添加一个元素(不是在最后一个位置)时,其他元素应该向后滑动(就像在队列中) 访问每个元素 通用的会很好,但不是必要的 我在MSDN上找到的数据结构不能满足我的要求 列表和链接列表不提供交换方法 我可以使用ArrayList,但我想在前面添加一个元素时效率会非常低(因为后面的所有元素都必须被复制和读取) 哈希表不提供订单 队列和堆栈不提供交换、随机访问 我可以编写自己的数据结构,但我不想重新发明轮子,因为.NE

我正在搜索提供以下功能的数据结构:

  • 在前面添加一个元素
  • 交换两个元素
  • 删除元素
  • 当我添加一个元素(不是在最后一个位置)时,其他元素应该向后滑动(就像在队列中)
  • 访问每个元素
  • 通用的会很好,但不是必要的
  • 我在MSDN上找到的数据结构不能满足我的要求

    • 列表
      链接列表
      不提供交换方法
    • 我可以使用
      ArrayList
      ,但我想在前面添加一个元素时效率会非常低(因为后面的所有元素都必须被复制和读取)
    • 哈希表
      不提供订单
    • 队列
      堆栈
      不提供交换、随机访问
    我可以编写自己的数据结构,但我不想重新发明轮子,因为.NET库太大了

    编辑:


    我需要一个数据结构,它提供类似的东西,比如进程优先级调度器。第一个条目的优先级最高,最后一个条目的优先级最低。有时我必须更改元素的优先级(交换)或完全删除元素(删除)。我最近添加的元素应该具有较高的优先级(这就是为什么我将其添加到最前面的位置)

    您确实需要计算出执行这些操作的频率,因为您列出了非常多的操作

    以下是我对你想法的看法:

    • 如果已经为get/set建立了索引,那么实现交换方法就很简单了
    • 如果您担心复制时间,那么请将列表反转,以便在前面有廉价的插入,您需要重写一些逻辑来完成它,但这不会停止使用数组作为后端

    最后一点,您肯定不需要某种类型的自动排序,因为这样做会大大简化操作。

    您确实需要计算出执行这些操作的频率,因为您列出了极端数量的操作

    以下是我对你想法的看法:

    • 如果已经为get/set建立了索引,那么实现交换方法就很简单了
    • 如果您担心复制时间,那么请将列表反转,以便在前面有廉价的插入,您需要重写一些逻辑来完成它,但这不会停止使用数组作为后端

    最后一点,您肯定不需要某种类型的自动排序,因为这会使排序变得非常简单。

    听起来您需要的是一个堆

    堆通常用于管理优先级,可以将优先级最高的项放在队列的顶部,并根据从堆中添加或删除的优先级不同的项重新排列

    下面是一个通用集合库,它实现了一个间隔堆:


    听起来你要找的是堆

    堆通常用于管理优先级,可以将优先级最高的项放在队列的顶部,并根据从堆中添加或删除的优先级不同的项重新排列

    下面是一个通用集合库,它实现了一个间隔堆:


    我怀疑是否有一种结构提供了交换方法。。。它很容易实现……”“重新发明轮子的好处是,你可以得到一个圆轮子。”-道格拉斯·克罗克福德怀疑有一个结构提供了交换方法。。。实施起来很容易……”“重新发明轮子的好处是,你可以得到一个圆形的轮子。”-道格拉斯·克罗克福德+1。实际上,您可以为IList编写一个扩展方法来实现这一点。我需要一个数据结构来提供类似的功能,比如进程优先级调度器。第一个条目的优先级最高,最后一个条目的优先级最低。有时我必须更改元素的优先级(交换)或完全删除元素(删除)。我最近添加的元素应该具有较高的优先级(这就是为什么我将其添加到最前面的位置)@user1826831:从原始数据结构的角度来看,堆可能是您的最佳选择,尽管实现所有必需的函数可能需要一些工作,但它们都应该能够执行。我留下我的答案,因为它回答了你原来的问题。如果您在查看堆结构后需要更多帮助,请随时发布另一篇文章。感谢您花时间回答我的问题。如果可以,我会接受两个答案。但克兰德瑞的分数比你少。接受克兰德利的回答可能会让他更有动力;)@user1826831:他的答案更正确,因为他包含了您正在寻找的数据结构。我只是把我的答案原封不动地留下来,这样,如果其他人出现并希望得到类似的结果,即使他们没有做优先级队列,他们也会得到一些提示。+1。实际上,您可以为IList编写一个扩展方法来实现这一点。我需要一个数据结构来提供类似的功能,比如进程优先级调度器。第一个条目的优先级最高,最后一个条目的优先级最低。有时我必须更改元素的优先级(交换)或完全删除元素(删除)。我最近添加的元素应该具有较高的优先级(这就是为什么我将其添加到最前面的位置)@user1826831:从原始数据结构的角度来看,堆可能是您的最佳选择,尽管实现所有必需的函数可能需要一些工作,但它们都应该能够执行。我留下我的答案,因为它回答了你原来的问题。如果您在查看堆结构后需要更多帮助,请随时发布另一篇文章。感谢您花时间回答我的问题。如果可以,我会接受两个答案。但克兰德瑞的分数比你少。接受克兰德利的回答也许是我