2009-05-06 14 views
5

मेरे पास शब्दकोश से निकालने के लिए एक शब्दकोश और कुंजी की एक सूची है। यह अभी मेरा कार्यान्वयन है:मैं LINQ का उपयोग कैसे एक शब्दकोष "prune" करने के लिए कर सकता हूं?

var keys = (from entry in etimes 
      where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
      select entry.Key).ToList(); 

foreach (var key in keys) 
{ 
    etimes.Remove(key); 
    count--; 
} 

क्या कुछ ऐसा है जो मैं फोरच लूप को खत्म कर सकता हूं?

+1

जिस तरह से आपको इसकी आवश्यकता नहीं थी। टोस्टिस्ट() फोरच किसी भी आईनेमेरेबल –

+0

के साथ काम करेगा LINQ एक क्वेरी भाषा है, जो मौजूदा डेटा को बदलकर नया डेटा बना सकता है। यह मौजूदा डेटा नहीं बदल सकता है। – codymanix

उत्तर

6
var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >= 
    Convert.ToInt64(stime)).ToDictionary(entry => entry.Key, 
     entry => entry.Value); 

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

+0

मैं इस तरह से प्रदर्शन पर टिप्पणी नहीं करना चाहता - अगर आप इसके बारे में परवाह करते हैं, तो दो विधियों का परीक्षण करें। मुझे यकीन नहीं है कि फोरैच का उपयोग करके आपका मूल समाधान * इतना * तेज होगा। – Noldorin

+0

मैं प्रदर्शन के बारे में चिंतित नहीं हूं, किसी भी समय शब्दकोश में केवल कुछ कुंजियां हैं। मैं बस LINQ का बेहतर संभाल पाने की कोशिश कर रहा हूं। धन्यवाद, यह बहुत अच्छा काम किया। – scottm

+0

यह प्रत्येक लूप के लिए सरल से अधिक महंगा हो सकता है क्योंकि यह एक नया शब्दकोश बनाएगा। और मुझे लगता है कि यह भी पठनीयता में सुधार नहीं करता है। इसलिए मैं बस प्रत्येक लूप के साथ चिपके रहूंगा और शायद इसे एक (एक्सटेंशन) विधि में ले जाऊंगा, लेकिन मुझे LINQ समाधान के लिए बिल्कुल कोई जीत नहीं दिखाई दे रही है। –

0

खैर, प्रदर्शन या पठनीयता मुद्दों को एक तरफ, नहीं यह भी निम्नलिखित की तरह कुछ किया जा सकता है:

<Extension> void itemDelete(List l, object item) { 
    l.Remove(item) 
} 

var keys = (from entry in etimes 
     where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
     select entry.Key).ToList(); 

keys.foreach(itemDelete()); 

मेरी कोडिंग माफ कर दो, मैं सटीक सिंटैक्स (विशेष रूप से सी # में की 100% निश्चित नहीं हूँ); उस छद्म कोड पर विचार करें। नए फ़ंक्शन के अतिरिक्त नोट करें, और । LINQ क्वेरी के अंत में पहले फ़ंक्शन। मुझे पता है कि यह वीबी में संभव होगा, मुझे लगता है कि सी # में कुछ समान है ... यदि नहीं, तो आप हमेशा अपना खुद का लिख सकते हैं .foreach एक्सटेंशन। यह कुछ भी सुधार सकता है या नहीं भी हो सकता है, लेकिन यह एक विचार है।

+0

मुझे माफ़ कर दो अगर यह एक बेवकूफ सवाल है, लेकिन क्या आप इस विस्तार विधि को आंशिक कक्षा में बनाएंगे? मैं अभी भी एक्सटेंशन विधियों के साथ पकड़ने की कोशिश कर रहा हूं और आप उनका उपयोग कैसे कर सकते हैं और कैसे बना सकते हैं। – Jagd

+0

@Jagd: आंशिक वर्ग का उपयोग करने के लिए यह कोई कारण नहीं है। अनुशंसित अभ्यास उन्हें * स्थिर वर्ग * और समूह विस्तार विधियों के भीतर समान कार्यक्षमता के स्थिर वर्गों में घोषित करना है। – Noldorin

+0

वीबी में आप उन्हें मॉड्यूल में बनाते हैं, इसलिए ... मैं कहूंगा कि नोल्डोरिन के सर्वोत्तम व्यवहारों को सुनें। – eidylon

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

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