2010-02-24 8 views
5

हाल ही में मैं एक छोटा स्निपेट कि मेरे परिणाम कैश और जिस तरह से मैं इसे एक शब्दकोश उपयोग कर रहा था इस प्रकार कर रहा था लागू करने पर काम कर रहा था:HashSet बनाम IQueryable

private Dictionary<ID, IQueryable<Results>> _simpleCache; 

विचार सभी परिणामों के लिए खोज करने के लिए था जिसमें आईडी 'आईडी' द्वारा निर्दिष्ट आईडी है और यदि शब्दकोश में कुंजी == आईडी है, तो हम केवल डेटाबेस यात्रा करने के बजाय IQueryable में मौजूद मानों के माध्यम से खोज करते हैं।

मैं आज सुबह तर्क के इस टुकड़े से अधिक जा रहा था और मैं इस प्रकार HashSet साथ IQueryable की जगह के बारे में सोच रहा था:

private Dictionary<ID, HashSet<Results>> _simpleCache; 

इस परिवर्तन की सलाह दी जाती बनाने है?

उत्तर

13

हां, यह है। आम तौर पर, IQueryable<T> का तात्पर्य है कि आप डेटा स्रोत प्रदाता का उपयोग कर रहे हैं, जिसे प्रत्येक बार क्वेरी करने योग्य समझा जाता है (बेशक, यह हमेशा मामला नहीं है, क्योंकि आप पर AsQueryable एक्सटेंशन विधि को कॉल कर सकते हैं जो आपको एक IQueryable<T>IEnumerable<T> कार्यान्वयन पर कार्यान्वयन)।

उस अंत में, IQueryable<Results> को एक शब्दकोश में संग्रहीत करना वास्तव में डेटा स्रोत पर किसी भी हिट को रोकता नहीं है जब आप इसे दूसरी बार गणना करते हैं। यह आपके द्वारा गणना किए जाने वाले डेटा प्रदाता प्रत्येक अनुरोध का अनुरोध करेगा।

इस वजह से

, आप आमतौर पर ग्राहक के पक्ष परिणाम अमल में लाना करने के लिए, आम तौर पर ToList या ToArray विस्तार तरीकों बुला, और फिर अपने शब्दकोश की TValue प्रकार पैरामीटर के रूप में IEnumerable<Results> या Results[] का उपयोग कर चाहते हैं।

ध्यान दें कि आप एक HashSet<T> इस्तेमाल कर सकते हैं अपने वस्तुओं को स्टोर करने के लिए, लेकिन आप यकीन है कि आप IEquatable<T> को लागू करने और GetHashCode ओवरराइड ताकि डिफ़ॉल्ट समानता comparer Results प्रकार से अवगत कराया ID उदाहरण पर एक तुलना प्रदर्शन करेंगे करना है , या तो, या आपको IEqualityComparer<T> कार्यान्वयन प्रदान करना होगा जो एक ही काम करेगा। यह संभावना से अधिक है कि आप डिज़ाइनर-जेनरेट कोड का उपयोग कर रहे हैं, और यह आपके लिए यह नहीं करेगा, और आपकी ऑब्जेक्ट्स द्वारा समानता के आधार पर संदर्भ द्वारा निर्धारित समानता होगी।

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