2010-06-20 5 views
6

मेरे पास कुंजी के रूप में int के साथ एक सिंक्रनाइज़ हैशटेबल है, और एक कस्टम क्लास है जिसे Job मान के रूप में कहा जाता है। मैं JobSize नामक अपनी नौकरी कक्षा में एक संपत्ति के आधार पर इस हैशटेबल को फ़िल्टर करना चाहता हूं। JobSize मूल्य Small, Medium, और Large के साथ enum है।मानों की संपत्ति के आधार पर हैशटेबल को फ़िल्टर करने के लिए लिंक का उपयोग करें कस्टम ऑब्जेक्ट

यह ठीक है अगर इसे करने के लिए इसे किसी अन्य संग्रह प्रकार में परिवर्तित करने की आवश्यकता है।

मैं जानता हूँ कि वहाँ एक चालाक LINQy तरीका यह है, लेकिन मैं इसे अभी तक नहीं मिला है ...

+0

संभव हैं, तो आप इस मामले 'शब्दकोश ' में, सामान्य संग्रह का उपयोग करना चाहिए। – svick

+0

@svick: हाँ, आप सही हैं। मैं सिर्फ थ्रेड सुरक्षा के बारे में आलसी हो गया, लेकिन यह एक बेहतर विकल्प है ... और आखिरकार, शायद सुरक्षित है क्योंकि मैं सिंक्रनाइज़ किए गए हैशटेबल के बजाय मैजिकल रूप से मेरे लिए सबकुछ का ख्याल रखने के बजाय अधिक सावधान रहूंगा। –

उत्तर

14

ऐसा लग रहा है यह मेरे लिए काम करेंगे:

var smallJobs = hashTable.Values.Cast<Job>().Where(job => job.JobSize == JobSize.Small); 

".Cast<Job>()" की आवश्यकता है क्योंकि Hashtable गैर सामान्य है।

+0

आपको 'हैशटेबल' जैसे जेनेरिक समकक्ष का उपयोग करना चाहिए जैसे । एक सिंक्रनाइज़ हैशटेबल प्राप्त करना आपके सभी समवर्ती समस्याओं को स्वयं हल नहीं कर सकता है। इसके अलावा, .NET 4 ConcurrentDictionary जोड़ता है, जो थ्रेड-सुरक्षित है। – Jacob

+0

पुष्टि की, यह यह करेगा :) – spookycoder

0

आप कुछ इस तरह उपयोग करने के लिए सक्षम होना चाहिए:

IEnumerable<Job> smallJobs 
    = hashTable.Values.Cast<Job>.Where(job => job.JobSize == JobSize.Small); 
+0

है यही कारण है कि मैं शुरू में करने की कोशिश की है, लेकिन मैं यह त्रुटि आई: विधि के लिए प्रकार तर्क 'IEnumerable System.Linq.Enumerable.Where (इस IEnumerable , Func ) के उपयोग से नहीं लगाया जा सकता । प्रकार तर्कों को स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें। तो, मैंने किया (या, मैंने सोचा था कि मैंने किया था): var smallJobs = hashTable.Values.Where (नौकरी => job.JobSize == JobSize.Small); लेकिन फिर, जोड़ना मतलब है कि मैं गैर-जेनेरिक प्रकार से जेनेरिक प्रकार में परिवर्तित नहीं कर सकता। –

+0

'हेस्टेबल' सामान्य नहीं है, इसलिए आपको पहले इसे कास्ट() 'करना होगा। – svick

+0

कोई 'System.Collections.Generic.Hashtable' नहीं है। – svick

1

क्या आपको अपने फ़िल्टर किए गए Hashtable में कुंजी और मान बनाए रखने की आवश्यकता है? यदि ऐसा है, तो इसे आजमाएं।

यह Hashtable को फ़िल्टर और एक जोरदार Dictionary<int,Job> टाइप किया रूप में फ़िल्टर परिणाम लौटाता है:

var filtered = yourHashtable.Cast<DictionaryEntry>() 
          .Where(x => ((Job)x.Value).JobSize == JobSize.Small) 
          .ToDictionary(x => (int)x.Key, x => (Job)x.Value); 
संबंधित मुद्दे

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