2010-08-10 20 views
14

मैं आमतौर पर संग्रह के लिए List<T> का उपयोग करता हूं। लेकिन अगर मुझे संग्रह पर तेज़ लुकअप की ज़रूरत है, तो उदा। निम्न उदाहरण में मैं एक शब्दकोश का प्रयोग करेंगे तो मैं इसे जल्दी से id से दे सकता है:शब्दकोश है <TKey, TValue> LINQ से एक सूची <T> पर तेजी से?

Dictionary<int, Customer> 

लेकिन चूंकि मैं वैसे भी नीचे के रूप में List<T> क्वेरी करने के लिए, LINQ उपयोग कर सकते हैं, वहाँ के माध्यम से जाने के लिए किसी भी कारण नहीं है एक सूची के बजाय एक शब्दकोश का उपयोग करने में परेशानी? शब्दकोश तेज है या 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 आइटमों के लिए तेज़ है - बेशक, उस विशेष सेटअप का उपयोग करके) –

उत्तर

24

यदि आप तार्किक रूप से एक संग्रह बनाना चाहते हैं जहां आप आसानी से अपने आईडी द्वारा ग्राहक को देख सकें, तो मैं IDictionary<int, Customer> का कुछ रूप उपयोग करूंगा। यह व्यक्त करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं।

अब आप एक सूची एक ही बात करने के लिए इस्तेमाल कर सकते हैं, और जैसा कि leppie छोटे डेटासेट इसके बारे में के रूप में तेजी से या यहाँ तक कि तेजी से हो जाएगा के लिए कहते हैं - लेकिन छोटे डेटासेट के लिए यह बहुत तेजी से हो जाएगा वैसे भी, तो क्यों करते हैं आप देखभाल करें? मुझे लगता है कि आपके कोड के पाठक को यह बताने के लिए और अधिक महत्वपूर्ण है कि आप संग्रह के साथ क्या करने का प्रयास कर रहे हैं - और एक शब्दकोष उस सूची को आईएमओ की तुलना में कहीं अधिक प्रभावी ढंग से प्राप्त करता है।

3

20 आइटम की तुलना में छोटे सूचियों के लिए, एक Dictionary/Hashtable इच्छाशक्ति की भूमि के ऊपर यह एक सूची की तुलना में धीमी होने के लिए कारण बनता है।

+2

दिलचस्प। आपको उन नंबरों को कहां मिला? मुझे इसके बारे में अधिक पढ़ने में दिलचस्पी है। – XIII

+0

क्या पुरानी हाइब्रिड डिक्शनरी से कटऑफ है? – Rup

+4

@XIII: थंब-चूसने वाला guesstimate :) – leppie

4

LINQ जादू नहीं है। आपके इच्छित तत्व को ढूंढने के लिए इसे अभी भी एक सूची के माध्यम से फिर से शुरू करना होगा। शब्दकोश अभी भी तेज़ होगा (उपयुक्त आकार के संग्रह के लिए, लेपी पॉइंट आउट के रूप में)

+3

धन्यवाद, हालांकि मुझे अभी भी विश्वास है कि LINQ जादू है :-) –

+2

आप कैसे कहते हैं कि LINQ जादू नहीं है ;-) – Contra

4

MSDN के अनुसार "ओ (1) ऑपरेशन के दृष्टिकोण" के आधार पर एक शब्दकोश से एक आइटम प्राप्त करने के अनुसार। दूसरी ओर सूची में Where निष्पादित करने के लिए तत्वों के माध्यम से मिलान के माध्यम से loops। तो आम तौर पर शब्दकोश निश्चित रूप से तेज़ होगा।

यदि आप लिंक ऑपरेशंस को तेज़ करना चाहते हैं तो आप Indexed LINQ का उपयोग कर सकते हैं जो आपके संग्रह पर अनुक्रमण डाल सकता है।

0

आप शायद इस संग्रह पर सॉर्टेडलिस्ट का उपयोग कर सकते हैं और बाइनरी खोज (इसे पहली तुलना के बाद संग्रह के आधे हिस्से को समाप्त कर सकते हैं) कर सकते हैं।

0

LINQ आमतौर पर इस तरह के ऑपरेशन में धीमा हो जाएगा। हालांकि, एक छोटे से पर्याप्त सेट (जैसे आपका उदाहरण) पर, ओवरहेड में मतभेदों के कारण, यह तेजी से तेज हो जाएगा। हालांकि, फिर से, एक छोटे से पर्याप्त सेट (जैसे आपका उदाहरण) पर किसी भी समाधान के बीच का अंतर इतना छोटा होगा कि इससे कोई फर्क नहीं पड़ता कि शब्दकोष क्या दिख रहा है या कहां() अधिक स्वाभाविक रूप से पढ़ता है।

संबंधित मुद्दे