2012-05-21 15 views
8

मैं Linq/लैम्ब्डा बारे में एक प्रश्न और निम्नलिखित मुद्दा है:शब्दकोशों एक दूसरे को काटना

मैं दो शब्दकोशों, प्राथमिक और माध्यमिक ... दो ये शब्दकोशों कुंजी = स्ट्रिंग, मान = पूर्णांक के रूप में परिभाषित कर रहे हैं। यदि कुंजी माध्यमिक शब्दकोश के साथ छेड़छाड़ की जाती है तो मुझे प्राथमिक शब्दकोश को ट्रिम करने की आवश्यकता होती है।

अर्थात्:

primaryDict = ["thing1", 33] ["thing2", 24] ["thing3", 21] ["thing4", 17] ["thing5", 12] 

secondaryDict = ["thing1", 22] ["thing3", 20] ["thing4", 19] ["thing7", 17] ["thing9", 10] 

resultDict = ["thing1", 33] ["thing3", 21] ["thing4", 17] 

मेरे प्रयास:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, t.Value); 

यह स्पष्ट रूप से क्योंकि primaryDict.Keys.Intersect कुंजी की एक सूची लौट रहा है काम नहीं करता है ... कैसे मैं एक नया पैर जमाने होगा शब्दकोश, या प्राथमिक शब्दकोश को जोड़ना? किसी भी सहायता की सराहना की जाएगी।

उत्तर

17

आप इस तरह से कर सकते हैं:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys) 
           .ToDictionary(t => t, t => primaryDict[t]); 

या, वैकल्पिक:

resultDict = primaryDict.Where(x => secondaryDict.ContainsKey(x.Key)) 
         .ToDictionary(x => x.Key, x => x.Value); 

बाद शायद थोड़ा और अधिक कुशल क्योंकि एक थ्रो-दूर संग्रह के निर्माण (एक इंटरसेक्ट विधि द्वारा उत्पन्न) से बचा जाता है और एक दूसरे का उपयोग-दर-कुंजी की आवश्यकता नहीं है primaryDict पर।

संपादित (के रूप में टिप्पणी प्रति):

resultDict = 
primaryDict.Where(x => secondaryDict.ContainsKey(x.Key)) 
      .ToDictionary(x => x.Key, x => x.Value + secondaryDict[x.Key]); 
+1

मुझे लगता है कि पिछले संस्करण में काफी बेहतर है, जैसा कि मैंने एक IEnumerable के रूप में शब्दकोश के इलाज के शब्दकोश का लाभ उठाने होंगे नहीं लगता कि, और ओ में चलेंगे (एन) समय। –

+0

जो मैंने कर रहा है उसके लिए बहुत अच्छा काम किया ... मैंने दूसरा समाधान इस्तेमाल किया और सबकुछ अपेक्षित के रूप में काम कर रहा है। आप डेव रॉक! –

+0

एक अनुवर्ती के रूप में ... क्या इस अभिव्यक्ति में मूल्यों को जोड़ना संभव है? –

2

untested है:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, primaryDict[t.Key]); 
3

आप अभी भी अपने Linq कथन में primaryDict उपयोग कर सकते हैं जब से तुम एक नई शब्दकोश है, जो केवल अपने चर को सौंप दिया जाता है एक बार यह बनाई गई है पैदा कर रहे:

resultDict = primaryDict.Keys 
         .Intersect(secondaryDict.Keys) 
         .ToDictionary(t => t, primaryDict[t]); 
संबंधित मुद्दे