2009-04-10 20 views
5

पर्यावरण यह है कि जिन सदस्यों को मैं संग्रह में धक्का दे रहा हूं वे नामहीन, पहचानने योग्य नहीं हैं (खराब abstractions से बचने के लिए, और कृपया, बाहर निकलना मत: सदस्यों वास्तव में हैं अन्य संग्रह उदाहरण)। तेजी से खोज करने में सक्षम होने के लिए, मैं प्रत्येक नए सदस्य के लिए एक सार्थक हैश नाम बना रहा हूं, और इसे "शीर्षतम" संग्रह की विधि विधि पर कुंजी स्ट्रिंग के रूप में प्रदान करता हूं।संग्रह ऑब्जेक्ट पर किसी आइटम की कुंजी प्राप्त करें

जब मैं के साथ खोज करना एक महत्वपूर्ण है, सब कुछ dandy ... समस्या मैं संग्रह के सदस्यों पुनरावृति और कुंजी है कि जोड़ें (उत्पन्न हैश पर उपलब्ध कराया गया था प्राप्त करना चाहते हैं, उस unfortunetely नहीं है रिवर्स-हैश के लिए संभव है)।

मैं परिभाषित करके आगे बढ़ रहा हूं कि सम्मिलित उप-संग्रह उदाहरण का पहला सदस्य एक स्ट्रिंग है, जिसमें उल्लेख किया गया हैश है, लेकिन अगर कोई इसे क्रैक करता है, तो मैं बहुत बाध्य हूं।

+0

कुछ कोड स्निपेट सहायक होंगे। – boj

उत्तर

6

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

एनबी वीबीए में ठीक से काम करने के लिए न्यूएनम प्राप्त करने के लिए कक्षा मॉड्यूल को निर्यात किया जाना चाहिए और मैन्युअल रूप से संपादित किया जाना चाहिए और फिर पुनः आयात किया जाना चाहिए।

Public Property Get NewEnum() As IUnknown 
Attribute NewEnum.VB_UserMemId = -4 
    Set NewEnum = someKeys.[_NewEnum] 
End Property 

उदाहरण

Option Explicit 
Private someKeys As Dictionary 
Private someCols As Collection 
Public Function Add(o As Object, Key As String) As Object 
    someKeys.Add Key, o 
    someCols.Add o, Key 
End Function 
Public Property Get Count() As Long 
    Count = someCols.Count 
End Property 
Public Property Get Item(vKey As Variant) As Object 
    Set Item = someCols.Item(vKey) 
End Property 
Public Sub Remove(vKey As Variant) 
    someKeys.Remove vKey 
    someCols.Remove vKey 
End Sub 
Public Property Get NewEnum() As IUnknown 
    Set NewEnum = someCols.[_NewEnum] 
End Property 
Public Property Get Keys() As Variant 
    Keys = someKeys.Keys 
End Property 
Private Sub Class_Initialize() 
    Set someKeys = New Dictionary 
    Set someCols = New Collection 
End Sub 
+0

यह क्रॉल करता है। बटन हैं: i) कुंजी विधि जोड़ें पर वैकल्पिक नहीं हो सकता है; ii) हटाने विधि के दौरान आप संबंधित कुंजी को कैसे हटाते हैं ?; iii) यह एसी.केस() को गूंगा संभव है। हटाएं मैं सुझाव देता हूं: ii) कुछ की.एड्स (कुंजी, कुंजी) कुछ की अनुमति देता है। रीमोव (vKey) बाद में; iii) स्ट्रिंग – jpinto3912

+0

i के रूप में कुंजी प्राप्त करें (लंबे समय तक एक इंडेक्स) i। अच्छी बात। ii। मैंने इसे कोई विचार नहीं दिया, और आपका सुझाव दो विकल्पों के बेहतर है, लेकिन कुंजी, कुंजी मुझे परेशान करती है। शायद कुंजी के लिए शब्दकोश बेहतर होगा। iii। यह वापस अनावश्यक होगा क्योंकि संग्रहित किए गए संग्रह के डिफ़ॉल्ट सदस्य .emem – cmsjr

+0

भी, प्रदर्शन की भावना में क्रॉल करता है, या समझ में नहीं आता है? – cmsjr

2

आप में आप खुद संग्रह कॉल कि कुंजी और संग्रह की दुकान अपने सदस्य संग्रह लपेट सकता है। संग्रह को फेंकने और तत्वों को उनकी कुंजी के लिए पूछने का एक मामला है (यानी आप हैश)।

0

साथ

Public Function NewEnum() As Collection 
     Set NewEnum = m_ObjectCollection 
End Function 

यह मेरे लिए काम किया

Public Function NewEnum() As IUnknown 
     Set NewEnum = m_ObjectCollection.[_NewEnum] 
End Function 

स्थानापन्न करने का प्रयास करें।

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