【问题标题】:Is Dictionary<TKey, TValue> faster than LINQ on a List<T>?Dictionary<TKey, TValue> 是否比 List<T> 上的 LINQ 快?
【发布时间】:2011-03-27 18:23:17
【问题描述】:

我通常使用List&lt;T&gt; 进行收藏。 但是,如果我需要快速查找集合,那么例如在以下示例中,我将使用字典,以便通过id 快速查找:

Dictionary<int, Customer>

但是既然我可以使用 LINQ 来查询List&lt;T&gt;,如下所示,是否有任何理由经历使用字典而不是列表的麻烦? 字典更快还是更快? LINQ 在幕后做了什么让它一样快?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Customer> customers = new List<Customer>()
            {
             new Customer { Id = 234, FirstName = "Jim", LastName = "Smith" },
             new Customer { Id = 345, FirstName = "John", LastName = "Thomas" },
             new Customer { Id = 654, FirstName = "Rick", LastName = "Ashton" },
             new Customer { Id = 948, FirstName = "Rod", LastName = "Anders" }
            };

            var customer = (from c in customers
                           where c.Id == 654 select c).SingleOrDefault();
            Console.WriteLine(customer.Display());

            Console.ReadLine();

        }
    }


    public class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        internal string Display()
        {
            return String.Format("{0}, {1} ({2})", LastName, FirstName, Id);
        }

    }
}

【问题讨论】:

  • 我发现这很有趣:dotnetperls.com/hybriddictionary(有趣的是,混合字典仅对 很少 ~5 个项目更快——当然,使用那个特定的设置描述)

标签: c# list collections dictionary


【解决方案1】:

对于小于 20 项的列表,Dictionary/Hashtable 的开销会导致它比列表慢。

【讨论】:

  • 有趣。你在哪里找到这些数字的?我有兴趣阅读有关它的更多信息。
  • 这是旧 HybridDictionary 类的截断点吗?
  • @XIII: 大拇指的猜测:)
【解决方案2】:

如果您逻辑上想要创建一个集合,您可以通过他们的 ID 轻松查找客户,我会使用某种形式的 IDictionary&lt;int, Customer&gt;。这表达了您想要实现的目标。

现在您可以使用列表来做同样的事情,正如 leppie 所说,对于小型数据集,它的速度差不多甚至更快 - 但对于小型数据集,它无论如何都会非常快,那你为什么在乎?我认为告诉读者你的代码你想用集合做什么更重要——字典比列表更有效地实现了这个目标,IMO。

【讨论】:

    【解决方案3】:

    LINQ 并不神奇。它仍然需要遍历一个列表来找到你想要的元素。字典仍然会更快(对于合适大小的集合,正如 leppie 指出的那样)

    【讨论】:

    【解决方案4】:

    根据MSDN 根据键“接近 O(1) 操作”从字典中获取项目。另一方面,在列表上执行Where 会循环遍历元素以查找匹配项。所以一般来说字典肯定会更快。

    如果您想加快 Linq 操作,您可以使用Indexed LINQ,它允许在您的集合上放置索引。

    【讨论】:

      【解决方案5】:

      您也许可以使用 SortedList 并对该集合执行二进制搜索(考虑到它在第一次比较后消除了一半的集合)。

      【讨论】:

        【解决方案6】:

        LINQ 在这种操作中通常会比较慢。但是,在足够小的集合上(例如您的示例),由于开销的差异,它可能会更快。然而,同样,在足够小的集合(例如您的示例)上,两种解决方案之间的差异都会非常小,以至于字典查找或 Where() 读取更自然的问题并不重要。

        【讨论】:

          猜你喜欢
          • 2011-04-11
          • 2016-06-14
          • 1970-01-01
          • 2010-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多