【问题标题】:What's missing from this strategy of choosing which C# collection to use?这种选择使用哪个 C# 集合的策略缺少什么?
【发布时间】:2011-03-27 00:58:38
【问题描述】:

这是我选择使用哪种 C# 集合类型的策略:

  • 如果集合中的项目数是固定的,则使用数组,例如:

    string[] 方向 = new string[] { "north", "south", "east", "west" };

  • 否则总是使用List<T>

  • 当然,除非您需要更专业的集合,例如Stack<T>, Queue<T>, or Dictionary<TKey, TValue>

  • 但不再使用 ArrayList

根据您的经验,该策略缺少什么?

【问题讨论】:

  • 不太确定为什么这是社区维基?
  • 我认为将意见问题标记为社区 wiki 是一种很好的礼仪。这个问题真的没有一个具体的答案,我只是想把我的策略放在那里,根据别人的经验看看,如果有什么我应该知道的遗漏。
  • 我的看法是,如果有明显错误的答案,它不属于社区维基。
  • 很遗憾,无法撤消社区 wiki:meta.stackexchange.com/questions/6821/…
  • 我几乎从不使用数组 (T[]) - List<T> 是我的默认值,即使对于固定大小的集合也是如此。

标签: c# data-structures collections conceptual


【解决方案1】:

你的规则很好用。

另外:

  • 始终优先使用通用(或专用)集合,而不是非通用(基于object)的集合。
  • 如果您只想检查是否存在而不是键值映射(通过 Dictionary 表示),请使用 HashSet<T>
  • 如果是字典,如果排序似乎很重要,请考虑使用有序映射(SortedList<...>SortedDictionary<...>)。
  • 如果中间有删除/插入操作,请使用链表。

当然还有最重要的一个:

  • 永远不要导出具体的集合类型:始终使用最通用的接口,即 - 在大多数情况下 - IList<T>IEnumerable<T>

【讨论】:

    【解决方案2】:

    我会说,在大多数情况下,即使我知道集合中的项目数,我也会使用 List,只是因为它提供的实用函数的数量以及与 LINQ 的兼容性。

    哈希图是一个重要的用例,当您希望更快地访问集合中的项目时。

    【讨论】:

      【解决方案3】:

      如果您计划重写继承类中的添加/删除/清除方法,您也可以使用Collection<T>,因为存在虚拟方法。

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 2022-11-19
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 2018-04-12
        相关资源
        最近更新 更多