代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

字典是否比列表中的linq快?

  •  14
  • Edward Tanguay  · 技术社区  · 15 年前

    我一般使用 List<T> 收藏。 但是,如果我需要对集合进行快速查找,例如,在下面的示例中,我将使用字典,以便通过 id :

    Dictionary<int, Customer>
    

    但是因为我可以用LINQ查询 列表& T; 不管怎样,如下面所述,有没有理由用字典来代替列表? 字典更快还是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);
            }
    
        }
    }
    
    6 回复  |  直到 15 年前
        1
  •  24
  •   Jon Skeet    15 年前

    如果你 逻辑上 想要创建一个集合,在那里你可以根据客户的ID轻松地查找他们,我将使用某种形式的 IDictionary<int, Customer> . 这表达了你想要达到的目标。

    现在你 能够 使用一个列表来做同样的事情,就像Leppie所说的,对于小数据集,它将以同样快的速度甚至更快的速度运行——但是对于小数据集,它将以非常快的速度运行,所以为什么你会在意呢?我认为更重要的是告诉你的代码的读者你要做的是收集-和一本字典实现这一目标远比一个列表,IMO有效得多。

        2
  •  4
  •   James Curran    15 年前

    Linq不是魔法。它仍然需要遍历一个列表来查找所需的元素。字典仍然会更快(如Leppie指出的,对于合适大小的集合而言)

        3
  •  4
  •   Giorgi    15 年前

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

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

        4
  •  3
  •   leppie    15 年前

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

        5
  •  1
  •   Jon Hanna    15 年前

    在这种操作中,LINQ通常会变慢。但是,在足够小的集合上(例如您的示例),由于开销的不同,它可能更快。然而,在一个足够小的集合(例如您的示例)上,两个解决方案之间的差异将非常小,以至于与字典查找还是where()读取更自然的问题没有多大关系。

        6
  •  0
  •   Raghu    15 年前

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