2012-03-10 8 views
6

से मेल खाती है, मुझे एक ऐसी सूची मिली है जो कई ऑब्जेक्ट्स स्टोर करती है। प्रत्येक ऑब्जेक्ट में एक चर के रूप में एक संपत्ति होती है।सबसे तेज़ डेटा संरचना यह जांचने के लिए कि ऑब्जेक्ट्स की सूची में कोई संपत्ति

मैं यह जांचने में सक्षम होना चाहता हूं कि इस सूची में से किसी एक आइटम में एक निश्चित संपत्ति है या नहीं। शब्दकोश के ContainsKey विधि के समान। यह डेटा संरचना बहुत अधिक मात्रा में मूल्यों को पकड़ने के लिए है, संभवतः यहां तक ​​कि लाखों और मैं इस प्रकार डेटा संरचना का उपयोग करना चाहूंगा जो गुणों को जितनी जल्दी हो सके जांच सके।

क्या शब्दकोश इस नौकरी के लिए सबसे तेज़ होगा, या वहां तेजी से डेटा संरचनाएं हैं?

संपादित करें:

यहां एक त्वरित, मैं प्राप्त करने के लिए चाहते हैं, उसे के छोटे उदाहरण है:

Dictionary<string, Person> persons = new Dictionary<string, Person>(); //where string contains the Person's name 

bool isPresent = persons.ContainsKey("Matt"); 
+1

ये लाखों रिकॉर्ड कहां से आ रहे हैं? डेटा स्रोत के विरुद्ध * क्वेरी * के विरुद्ध एक IENumerable डेटा सबसे तेज़ है। स्मृति में लाखों रिकॉर्ड लोड हो रहा है व्यावहारिक नहीं है। डेटाबेस/एनओएसक्यूएल को LINQ के माध्यम से भारी उठाने दें। – tawman

+0

क्या आप पहले से ही प्रकार और संपत्ति जानते हैं। अर्थात। क्या आप "क्षेत्र" संपत्ति के लिए "ऑर्डर" ऑब्जेक्ट का परीक्षण कर रहे हैं? या यह एक निश्चित नाम संपत्ति के लिए एक अज्ञात वस्तु है? या यह गतिशील उपयोग कर सकता है? या यदि सदस्य तय नहीं है, शायद फास्टमेम्बर? या ...? या ...? कृपया एक उदाहरण जोड़ें ... –

+0

@tawman: रिकॉर्ड के आकार के आधार पर स्मृति में लाखों रिकॉर्ड * बिल्कुल * व्यावहारिक (और चमकदार रूप से तेज़) हो सकते हैं। पिछली नौकरी में मैंने कोड को परिवर्तित करके * बेहद * प्रदर्शन को बढ़ावा देने में कामयाब रहा, जो डेटाबेस तालिका में एक मेमोरी में एक लुकअप कर रहा था, जो मेमोरी उपयोग को कम करने के लिए ट्यून किया गया था। यह सब संदर्भ पर निर्भर करता है। –

उत्तर

6

ऐसा लगता है कि आप मूल रूप से सिर्फ एक HashSet<T> सभी संपत्ति मूल्यों से युक्त की जरूरत है - यह सोचते हैं आप वास्तव में सिर्फ यह जानना चाहते हैं कि इसमें निहित है या नहीं।

उदाहरण के लिए:

var allNames = new HashSet<string>(people.Select(person => person.Name)); 
+1

मैंने अपने प्रश्न को संपादित किया है कि मैं जो कुछ भी कर रहा हूं उसका त्वरित उदाहरण प्रस्तुत करें। क्या मेरे विशेष मामले में हैशसेट एक शब्दकोश से तेज होगा? –

+0

@ सेन: संभावित रूप से - आपको बेहतर कैश कोहेरेंसी मिल सकती है क्योंकि स्टोर करने के लिए कोई "मूल्य" नहीं है। यह निश्चित रूप से अधिक स्मृति कुशल होगा (एक समझदार कार्यान्वयन मानते हुए)। सबसे महत्वपूर्ण बात यह है कि एक सेट उस शब्दकोश का प्रतिनिधित्व करता है जिसमें आप रुचि रखते हैं (कुछ की उपस्थिति या अनुपस्थिति) एक शब्दकोश से अधिक सटीक रूप से (जो एक कुंजी/मूल्य * मैपिंग * का प्रतिनिधित्व करता है)। –

+0

जब आप इसे इस तरह रखते हैं, तो ऐसा लगता है जैसे यह मेरी विशिष्ट समस्या के लिए अधिक उपयुक्त है। जैसा कि आपने बताया है, एक कुंजी/मूल्य मैपिंग, हालांकि मेरे उदाहरण में मौजूद है, केवल एक अंत का साधन है - जिसे शायद अब भी हैशसेट के माध्यम से चित्रित किया जा सकता है। मैं कोशिश करूँगा, धन्यवाद! –

0

यह निर्भर करता है। यदि आप एक बार एक शब्दकोश में डेटा लोड कर सकते हैं और फिर इसे कई बार पूछ सकते हैं, तो एक शब्दकोश स्पष्ट रूप से सबसे तेज़ संभव डेटा संरचना है। यदि कई वस्तुओं में एक ही संपत्ति मूल्य हो सकता है, तो आपको Dictionary<TKey,List<TValue>> बनाना होगा या LINQ लुकअप का उपयोग करना होगा।

हालांकि, अगर आपको प्रत्येक बार जब आप क्वेरी करते हैं तो सूची लोड करना होता है, तो शब्दकोश का उपयोग करने में कोई फायदा नहीं होता है। सूची लोड करते समय आप सही गुणों का पता लगा सकते हैं या यदि आप किसी डेटाबेस से पूछताछ कर रहे हैं, तो उचित क्लॉज का उपयोग करके केवल आवश्यक डेटा लोड करने का प्रयास करें।

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