2012-07-25 20 views
6

मेरे पास 2 अलग-अलग प्रकार के शब्दकोश हैं Dictionary<int, Fooclass> oldDic और Dictionary<int, string> barList newDic। अब मुझे दोनों शब्दकोशों में मूल्यों की तुलना करने की आवश्यकता है। उदाहरण के लिए महत्वपूर्ण हो सकता है मेंलिंक: दो अलग-अलग प्रकार के शब्दकोशों को छोड़कर

  • oldDic: 1,2,3
  • newDic: 1,2,3,4
  • अपेक्षित आउटपुट: 4

अब मैं दोनों की तुलना करने की जरूरत है अपनी चाबियों के आधार पर शब्दकोश किसी भी मदद की सराहना की जाएगी।

संपादित करें: आउटपुट दूसरे शब्दकोश (न्यूडिक) जैसा होना चाहिए लेकिन इसमें 2 डिक्शनरी (पुरानी डिक) का कुछ मूल्य होगा। उदाहरण

1 के लिए, "fooString" कहाँ fooString अधिक स्पष्टता के लिए Fooclass के someproperty में कुछ मूल्य .... है इस जो मेरे लिए काम किया नहीं करती

var addedList = from list1 in baseListDic 
join list2 in trackerlist on list1.Key equals list2.Key 
select new { key = list1.Key, value = list1.Value._lead }; 

यहाँ baseListDic oldDic है और trackerlist है newDic .... मुझे पता है कि अगर मैं अभी भी स्पष्ट नहीं कर रहा हूँ चलो ...

+1

IEnumerable परिणाम = newDic.Keys.Except (oldDic.Keys) –

+0

@huMptyduMpty अच्छी तरह से मैं इस की कोशिश की है, लेकिन यह भी मुझे उत्पादन केवल 4. देता है लेकिन मैं fooClass से कुछ मूल्य की जरूरत है भी ... मेरे देखना उपरोक्त पोस्ट में नया संपादन .. –

+0

आपका नया संपादन आपके मूल उदाहरण से सहमत नहीं प्रतीत होता है। अपने मूल में आप उस कुंजी को वापस कर रहे हैं जो कि नए रंग में है लेकिन पुरानी डिक नहीं है, लेकिन आपके दूसरे उदाहरण में आप पुराने में मूल्य लौट रहे हैं जिसमें न्यूडिक में चाबियाँ हैं? शायद कुछ नमूना शब्दकोशों के साथ एक छोटा सा कार्यक्रम बनाएं जो दर्शाता है कि आप क्या चाहते हैं? कोई भी आपको कभी भी कुछ कोड देने के लिए ऑब्जेक्ट नहीं करेगा जो वे आसानी से चला सकते हैं ... :) – Chris

उत्तर

9

पुरानी शब्दकोश में वही कुंजी रखने वाले नए शब्दकोष को अनदेखा करने के लिए एक नया शब्दकोश बनाना आसान होगा।

var result = newDic 
    .Where(kvp => !oldDic.ContainsKey(kvp.Key)) 
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
5

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

यदि आप वास्तव में केवल चाबियों की तुलना कर रहे हैं तो आप केवल .Keys संपत्ति का उपयोग कर सकते हैं शब्दकोश जो एक IEnumerable<TKey> जिन पर आप अपने LINQ कर सकते हैं देता है ...

जैसे की:

var expectedOutput = newDic.Keys.Except(oldDic.Keys); 

यह कुंजी एक ही प्रकार किया जा रहा है पर निर्भर करता है लेकिन यह कह अगर आप तुलना कर रहे हैं बिना चला जाता है। बेशक, आप अपने प्रकारों को पहले परिवर्तित करने से रोक नहीं सकते हैं यदि आप इसे विभिन्न प्रकारों से करने के लिए करते हैं।

इसके अलावा, अगर आप तो शब्दकोशों आप की तरह कुछ कर सकते हैं में से एक में मान प्राप्त करना चाहता था:,

var newDicValues = expectedoutput.Select(x=>newDic[x]); 

या, क्या आप जानते हैं किसी भी अन्य linqy सामान आप की तरह महसूस करते हैं।:)

+0

आपके समाधान ने मुझे कुछ अन्य विचार भी दिए हैं .. धन्यवाद –

0

सही ढंग से समझ में आया, इस

की तरह कुछ है, तो आप इस Dictionary<int, Fooclass> FinalDict

  IEnumerable<int> list = OldDic.Keys.Except(NewDic.Keys); 
      foreach (var x in list) 
      { 
       var value =new MyClass(); 
       OldDic.TryGetValue(x,out value); 
       FinalDict.Add(x,value); 
      } 

तरह moething एक अलग शब्दकोश तो शब्दकोश में कहा जाता FinalDict कुंजी है और राशि की कोशिश संबंधित फोकलस

उम्मीद है कि यह

+0

सभी एक्स पुराने से आए थे, आपको TryGetvalue का उपयोग करने की आवश्यकता नहीं है ... असल में मैंने सोचा होगा कि यह 'OldDic' के रूप में आसान होगा। x =>! NewDic.ContainsKey (x.Key))। ToDictionary (x => x.Key, x => x.Value) ' – Chris

2

दो अलग-अलग सूची के बीच अंतर प्राप्त करने के लिए इसे आजमाएं: यदि उनके पास कोई आम संपत्ति है।

var differentItems = List<Type1>.Select(d => d.Name) 
         .Except(List<Type2>.Select(d => d.Name));