2010-08-10 73 views
14

我一般使用List<T>进行收藏。 但是,如果我需要对集​​合进行快速查找,那么例如在下面的例子中我会用一个字典,所以我可以很快看它由id字典<TKey,TValue>比列表上的LINQ更快<T>?

Dictionary<int, Customer> 

但因为我可以使用LINQ查询List<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); 
     } 

    } 
} 
+0

我发现这很有趣:http://www.dotnetperls.com/hybriddictionary(有趣的是,注意到混合词典只有*很少* 5项更快 - 当然,使用特定的设置描述) – 2011-02-27 06:49:24

回答

24

如果你逻辑上想创建一个集合,你可以很容易地通过他们的ID查找客户,我会使用某种形式的IDictionary<int, Customer>。这表达了你想要达到的目标。

现在你可以使用清单,做同样的事情,并作为leppie说,对小数据集这将是一样快,甚至更快的 - 但对于小型数据集这将是非常快的,无论如何,那么为什么你在乎?我认为,告诉读者你的代码要处理的是什么更重要 - 而且字典的实现远比列表,IMO更有效。

3

对于列出20余项小,一个Dictionary/Hashtable意志的开销,使其比列表慢。

+2

有趣。你在哪里找到这些数字?我有兴趣阅读更多关于它的信息。 – XIII 2010-08-10 11:01:13

+0

这是从旧的HybridDictionary类中断吗? – Rup 2010-08-10 11:05:26

+4

@XIII:拇指吮吸的猜测:) – leppie 2010-08-10 11:24:15

4

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

+3

谢谢,虽然我仍然相信LINQ是神奇的:-) – 2010-08-10 11:06:49

+2

你怎么敢说LINQ不是魔法;-) – Contra 2016-06-10 17:45:16

4

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

如果你想加快Linq操作,你可以使用Indexed LINQ,它允许你的收藏索引。

0

您也许可以使用SortedList并在此集合上执行二分搜索(考虑它在第一次比较后会消除一半的集合)。

0

LINQ在这类操作中通常会比较慢。但是,在一个足够小的集合上(比如你的例子),由于开销的不同,它可能会更快。然而,在一个足够小的集合上(比如你的例子),任何一个解决方案之间的差别将会很小,以至于不管字典查询还是Where()读取更自然的问题都没有关系。