【问题标题】:System.Collections - why so many options?System.Collections - 为什么有这么多选项?
【发布时间】:2010-10-07 12:33:27
【问题描述】:

我的大部分编程经验都是使用一种语言,其中有一个集合数据结构——数组。现在我主要在 .NET 中工作,我开始欣赏大量可用的工具,但我也发现很难确定哪些工具最适合每个问题。我发现收藏品经常出现这种情况。

我确信我能够通过时间/经验更快地找到适合该工作的工具,但谁能提供一些关于哪些收藏类适合哪些工作的指导?有什么好的经验法则可以遵循吗?

编辑:我发现我几乎总是使用 List(T),这就是引发这个问题的原因。我知道使用其他类有非常具体的原因。尽管 List(T) 大部分时间都有效,但我想避免在另一个结构更适合时将某些内容塞入通用列表中。我必须能够发现这些情况。

谢谢!

【问题讨论】:

    标签: .net arrays collections list


    【解决方案1】:

    你没有说你以前使用什么语言,但我很有信心地说,如果你认为数组是唯一可用的东西,那么你可能弄错了。

    例如,C++ 仅原生支持数组“集合”(“集合”在这里使用得非常松散),但是通过添加指针,您可以为 .Net 中可用的任何集合数据结构实现等价物。事实上,如果您查看 C++ 标准模板库,您会发现大多数常见结构的库存实现。

    附加结构的原因是数组并不总是,甚至经常是最适合用于数据集合的结构。它有许多可以通过一个或另一个集合来解决的限制,并且使用这些不同的集合,您通常可以从 少得多 代码中获得 更好 性能,并减少您的数据结构实现中也可能存在错误。

    在决定使用什么集合类型时,您需要查看它的使用方式最常见。例如,集合中的所有对象是否都应该属于同一类型、继承自同一类型或任何类型?你会经常添加和删除项目吗?如果是这样,您是否总是推送/弹出、排队/出列项目,或者您是否需要将项目添加到特定位置?您会按键、按索引或同时按两者查找特定项目吗?如果通过key,key是如何确定的?

    一些比较常见的集合:

    • List<T> 可能应该用于大多数您习惯使用数组的情况。它支持使用与数组相同的语法按索引查找,性能接近数组,是强类型的,并且使添加或删除项目变得非常容易,并且非常快速地追加或弹出项目(插入到特定位置要慢得多)。

    • LinkedList<T> 如果您接受过任何正式的计算机科学培训,听起来应该很熟悉。它使用类似于 List 的语法,但进行了不同的优化:查找速度较慢,因为它们需要遍历列表,而将项目添加或删除到特定位置会快得多。

    • Dictionary<TKey, TValue> 使用类似于List<T> 的语法,但不是数组索引,而是将键值放在括号中。字典很棒,因为通过键查找特定项目被认为是非常快,因为无论字典中有多少项目,找到你需要的时间总是相同的需要。

    • SortedList<TKey, TValue> 的工作方式与字典非常相似,不同之处在于,当您对其进行迭代时,项目将按键排序返回。但是,如果不先迭代它之前的所有项目,则无法查找第 n 个项目。

    • KeyedCollection 经常被忽视,因为它隐藏在与其他一些集合不同的命名空间中,您必须实现一个(非常简单的)函数才能使用它。它的工作方式也很像字典,此外它还支持按索引轻松查找。当项目的键是项目本身的简单属性时,通常使用它。

    • 不要忘记旧的备用数据库:StackQueue。同样,如果您有任何正式的计算机科学教育,您应该已经非常清楚这些是如何根据他们的名字工作的。

    最后,这些集合(包括数组!)中的大多数都实现了一组通用接口。这些接口非常有用,因为您可以针对接口而不是特定集合编写程序,然后您的函数可以接受实现该接口的任何集合。例如,无论您传入一个字符串数组、List<string> 还是任何其他 IEnumerable<string>,以下代码都将起作用:

    void WriteToConsole(IEnumerable<string> items)
    {
        foreach (string item in items)
        {
           Console.WriteLine(item);
        }
    }
    

    其他值得关注的接口包括IList&lt;T&gt;ICollection&lt;T&gt;IQueryable&lt;T&gt;

    【讨论】:

    • 一些您可能想要添加到您原本出色的回复中的内容:将元素添加到 List 只有在最后添加它们时才会快速;并提到 LinkedList,它在任何地方都有非常快的插入和删除,但不支持直接索引元素。
    【解决方案2】:

    通用列表(List) 适合常用。他们不进行装箱和拆箱。所以没有性能问题。

    List<string> items = new List<string>();
    items.Add("abc");
    items.Add("dfg");
    

    ArrayLists 接受任何对象作为项目。因此它们非常适合存储多种类型的情况。例如,如果您需要在同一个集合中存储一个 int 和一个字符串,arraylist 就可以做到这一点。

    ArrayList items = new ArrayList();
    items.Add("abc");
    items.Add(1);
    items.Add(DateTime.Now);
    

    SortedListsHashtables 是存储键值对。您可以为您的项目定义一个键。这可以帮助您快速找到它们。 SortedLists 是自动排序的 Hastables。

    Hashtable items1 = new Hashtable();
    items1.Add("item1", "abc");
    items1.Add("item2", "dfg");
    
    SortedList items2 = new SortedList();
    items2.Add("Second", "dfg");
    items2.Add("First", "abc");
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      就像计算机科学中的许多其他事情一样,当有多种选择时,通常意味着有多种方法可以做某事。正如其他人所说,每个集合都有各种优点和缺点。无论您是否使用集合的通用版本,最终所有集合都提供这些操作:

      • 插入
      • 更新
      • 删除
      • 查找
      • 枚举

      对于这些操作中的每一个,不同的集合具有不同的性能特征。例如,数组可以快速更新项目,但插入或删除项目需要更长的时间。查找速度非常快。

      将其与列表进行比较。列表插入速度非常快。查找需要更长的时间。更新和删除操作要求您已经拥有该项目并且速度非常快。数组和列表的枚举大致相同。

      所有集合也有某些行为,例如,集合是否保持排序。如果是这样,那么插入/更新/删除操作将花费更长的时间,但会加快查找速度。

      因此,取决于您的程序大部分时间在做什么,将决定使用哪个集合。

      【讨论】:

        【解决方案4】:

        Stacks、Queues、SortedList、Dictionary、HashTable 等集合都是标准数据结构,可以在各种情况下派上用场。

        Queue 可以实现 FIFO,而无需您自己动手。堆栈为您提供 LIFO。 SortedLists 为您提供预排序列表等。

        集合命名空间中还有很多其他的,都在讨论here

        【讨论】:

          【解决方案5】:

          我可以提供两个提示: 1. 尽可能使用泛型集合。 2. 在 HashSet 和 List 泛型集合之间做出决定时,请真正了解您将使用它们的目的。哈希集在搜索时可能会更快,但插入也会减慢(我发现)。

          【讨论】:

            【解决方案6】:

            算法和数据结构。各有优缺点,各有目的。

            【讨论】:

              【解决方案7】:

              有很多与此问题相关的帖子,您必须考虑您真正需要做什么。您是否需要基于字符串的键(¿)如何填充数据,您是否需要本机方法来查找是否存在任何键或是否存在任何值(?)

              泛型是我最常用的,但其他的也有原因;)

              http://discuss.fogcreek.com/dotnetquestions/default.asp?cmd=show&ixPost=5119

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-04-02
                • 2016-06-14
                • 2010-10-06
                • 2023-03-14
                • 2017-11-30
                • 2013-02-24
                • 2012-02-10
                相关资源
                最近更新 更多