2012-01-13 20 views
11

क्या दो सामान्य शब्दकोशों के बीच अंतर खोजने के लिए एक LINQ विधि है?
this question में समान है, लेकिन सामान्य शब्दकोशों के साथ।दो शब्दकोशों के बीच अंतर खोजना

+0

आप 'AsEnumerable' का उपयोग एक' IEnumerable 'में अपने शब्दकोश" कन्वर्ट "करने के लिए कर सकता है, और उसके बाद का उपयोग समाधान से जुड़ा हुआ प्रश्न में सुझाव दिया। चूंकि KeyValuePair एक संरचना है, इसलिए इसे मूल्य से तुलना करनी चाहिए। – Heinzi

+1

आपको 'AsEnumerable' की आवश्यकता नहीं है, क्योंकि यह बिल्कुल कोई रूपांतरण नहीं करता है। 'IENumerable ' एक्सटेंशन में इंटेलिजेंस विधियों को सीमित करने के साथ-साथ ऑब्जेक्ट्स पर 'IENumerable ' एक्सटेंशन का उपयोग करने की इजाजत देने के लिए इंटेलिजेंस विधियों को सीमित करने के लिए यह केवल एक सुविधाजनक तरीका है जो 'IQueryable ' को लागू करने की आवश्यकता के बिना लागू करता है। – Nuffin

+2

'dic1.Except (x => dic2.Contains (x)) संघ (dic2.Except (x => dic1.Contais (X)); ', क्या आप बेहतर तरीका चाहते हैं? –

उत्तर

21
var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne)); 
+1

क्या यह विधि केवल कुंजी की तुलना करता है? –

+2

@ bto.rdz नहीं, दोनों कुंजी और मान। – Magnus

+0

उत्कृष्ट लेकिन 'शून्य' की जांच करना न भूलें –

0

ऐसा कुछ?

var dicOne = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"few","faew"}}; 
var dicTwo = new Dictionary<string, string>(){ {"asdf", "asdf"}}; 

var unContained = dicOne.Where(x => !dicTwo.Contains(x)); 
+2

उन तत्वों को केवल' dictTwo' में नहीं बल्कि 'dictOne' में नहीं है। –

1

तो प्रदर्शन के लिए महत्वपूर्ण है, तो आप शब्दकोश वर्ग के हैश देखने का उपयोग करें और गति में सुधार लाने के लिए चाहते हो सकता है। मैंने 1 मिलियन प्रविष्टियों के साथ एक शब्दकोश का परीक्षण परिदृश्य लिया, इसे गहराई से कॉपी किया और प्रतिलिपि में 10 संपादन (5 प्रविष्टियां हटा दी गईं, 5 जोड़े) बनाई। [मेरे पास ऐसा करने का एक कार्य था जिसमें डेटा में परिवर्तन की तलाश शामिल थी, और उसके बाद केवल दूसरे फ़ंक्शन के माध्यम से परिवर्तनों को दबाया गया था।]

LINQ के साथ (मैग्नस का उत्तर देखें) स्टॉपवॉच के अनुसार लगभग 3600ms था। Dictionary.Contains() का उपयोग करके सरल तुलना के साथ, समय बीत गया 600ms लगभग था। पर्यावरण एक ही मशीन पर एक ConsoleApp परीक्षण दोहन के लिए डीबग मोड में विजुअल स्टूडियो 2017 समुदाय था।

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

public static void DiffDictionaries<T, U>(
     Dictionary<T, U> dicA, 
     Dictionary<T, U> dicB, 
     Dictionary<T, U> dicAdd, 
     Dictionary<T, U> dicDel) 
    { 
     // dicDel has entries that are in A, but not in B, 
     // ie they were deleted when moving from A to B 
     diffDicSub<T, U>(dicA, dicB, dicDel); 

     // dicAdd has entries that are in B, but not in A, 
     // ie they were added when moving from A to B 
     diffDicSub<T, U>(dicB, dicA, dicAdd); 
    } 

    private static void diffDicSub<T, U>(
     Dictionary<T, U> dicA, 
     Dictionary<T, U> dicB, 
     Dictionary<T, U> dicAExceptB) 
    { 
     // Walk A, and if any of the entries are not 
     // in B, add them to the result dictionary. 

     foreach (KeyValuePair<T, U> kvp in dicA) 
     { 
      if (!dicB.Contains(kvp)) 
      { 
       dicAExceptB[kvp.Key] = kvp.Value; 
      } 
     } 
    } 
संबंधित मुद्दे