2010-08-10 22 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()讀取更自然的問題都沒有關係。

相關問題