2010-07-15 4 views
8

मैं एक ऐसे शब्दकोश में सभी चाबियाँ ढूंढने की कोशिश कर रहा हूं जो किसी अन्य शब्दकोश में नहीं हैं। जाहिर है, मैं इसे नेस्टेड लूप का उपयोग करके कर सकता हूं, लेकिन मैं इस समय LINQ सीखने की कोशिश कर रहा हूं और मैं सोच रहा था कि क्या मैं इस कार्य को पूरा करने के लिए इसका उपयोग कर सकता हूं?एक संग्रह से सभी चाबियाँ खोजने के लिए LINQ का उपयोग करना जो दूसरे में नहीं हैं?

Dictionary<string, List<string>> DBtables = this.CollectTableListings(); 
var generic = from Dictionary<string,List<string>> tab 
       in DBtables 
       where !_tables.ContainsKey(???) 
       select tab; 

किसी भी विचार क्या प्रश्न चिह्न के स्थान पर जाना चाहिए (या शायद पूरे जहां खंड के बजाय):

यहाँ मैं अब तक राशि है?

+0

एक नोट के रूप में, "टैब" कोड आप पोस्ट में पहले प्रकार निर्दिष्ट करने की कोई जरूरत नहीं है। – Kirk

उत्तर

11

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

var resultKeys = DBTables.Keys.Except(_tables.Keys); 

Except() विधि अनिवार्य रूप से एसक्यूएल में minus संचालन के रूप में ही है - यह पहला संग्रह दूसरे में उन लोगों को छोड़कर से सभी आइटम देता है। चूंकि शब्दकोष अपनी चाबियाँ उजागर करते हैं, इसलिए आप इस तरह उनके अंतर की गणना कर सकते हैं।

Except() ऑपरेटर प्रकार के लिए डिफ़ॉल्ट समानता का उपयोग करता है, लेकिन एक ओवरलोड भी है जो आपको मूल्यों की तुलना करने के तरीके के अर्थशास्त्र को ओवरराइड करने के लिए अपना स्वयं का IEqualityComparer निर्दिष्ट करने की अनुमति देता है। आपके उदाहरण में, आपको शायद इसकी आवश्यकता नहीं है - लेकिन इसे वहां जानना अच्छा लगता है।

+4

कृपया ध्यान दें, 'छोड़ें() 'रिटर्न ** विशिष्ट ** परिणाम। हालांकि इस उदाहरण में वांछित हो सकता है, यह अन्य कार्यान्वयन में उपयोग के लिए ध्यान देने योग्य है। – Aren

+0

@ एरेन बी: ​​सच है, लेकिन 'शब्दकोश <>' के मामले में, वे कुंजी पहले से ही अलग होने की गारंटी दी गई हैं। – LBushkin

+1

मुझे पता है, यही कारण है कि मैंने कहा कि यह उदाहरण वांछित है। लेकिन कोई इस धागे पर * सूची घटाव * की तलाश में ठोकर खा सकता है और सोच सकता है कि 'छोड़कर() 'उनकी समस्याओं का समाधान कर सकता है। इसलिए मैंने क्यों कहा कि यह ध्यान देने योग्य था। – Aren

2
Dictionary<string, List<string>> dictOne = ... 
Dictionary<string, List<string>> dictTwo = ... 

var missingKeys = dictOne.Keys.Where(x => !dictTwo.ContainsKey(x)); 
1
Dictionary<string, List<string>> dictionary = this.CollectTableListings(); 
Dictionary<string, List<string>> otherDictionary = getOtherTable(); 

var keys = from key in dictionary.Keys 
      where !otherDictionary.Keys.Contains(key) 
      select key; 

(लेकिन LBuskin का जवाब बेहतर है)

0

आप क्वेरी सिंटैक्स मैं नीचे करने के लिए कुछ सदृश करना होगा उपयोग करना चाहता था, तो:

var keys = from d1 in dictionary1 
      select d1.Key; 
var items = from d2 in dictionary2 
      where d2.Key in keys 
      select d2; 
foreach(var item in items) 
{ 
} 
संबंधित मुद्दे