2010-03-16 70 views
6

什麼是更快,我應該犧牲Linq標準以實現速度(假設字典查找確實更快)?因此,讓我闡述:字典查詢(O(1))與Linq其中

我有以下幾點:

List<Product> products = GetProductList(); 

我有一個需要搜索基於一些屬性的產品,例如,序列號。我可以先創建一個字典,然後填充它如下:

Dictionary<string, Product> dict = new Dictionary<string, Product>(); 
foreach(Product p in products) 
{ 
    dict.Add(p.serial, p); 
} 

當它的時間來找到一種產品,需要的O的優勢(1)通過字典查找提供:

string some_serial = ...; 
try { Product p = dict[some_serial]; } catch(KeyNotFoundException) { } 

可替代地,使用LINQ:

Product p = products.Where(p => p.serial.Equals(some_serial)).FirstOrDefault(); 

與字典方法的缺點是,當然這需要在存儲器中更多的空間,更多的代碼編寫,少優雅等(雖然大部分是有爭議的)。假設這是非因素。我應該採取第一種方法嗎?最後,我想確認一下,上述Linq方法的複雜性是否確實是O(n),我不知道它如何能比這更好。

回答

6

假設你開始與對象的枚舉,並且只這樣做一次......

它會更快做Where方法,而不是添加到Dictionary<TKey,TValue>再想找回來了。原因是字典方法是而不是 O(1)。在這種情況下,您將項目添加到字典,然後查找它。添加的部分是O(N),它與Where方法一樣昂貴,並帶有額外的內存開銷。

要知道的另一個小點是Dictionary<TKey,TValue>不是真正的O(1)。它接近O(1),但在某些情況下可能會降低性能(例如大量衝突鍵)。

+0

是的,我忘了考慮添加到字典的開銷。謝謝。 –

+3

但是如果我多次使用詞典(即100次)而不是一次? –