2013-04-22 3 views
5

मैं एक शब्दकोश जहां कुंजी एक आईडी है है और मान एक स्ट्रिंगक्या सी # में एक शब्दकोश के लिए एक ContainsAny() विधि है?

मैं अब व्यक्ति की एक सूची वस्तुओं जहां प्रत्येक व्यक्ति को एक CarIds संपत्ति है कि है एक

IEnumerable<int> 

मैं चाहता हूँ है मूल रूप से वस्तुओं की सूची को केवल उन वस्तुओं को शामिल करने के लिए फ़िल्टर करें जहां गुणों में से एक को निर्देश में शामिल किया गया है।

उदाहरण के लिए

। कुछ इस तरह:

var dictionary = GetDict(); 

var people = GetPeople(); 

people = people.Where(r => dictionary.ContainsAny(r.CarIds)).ToList(); 

कुछ इस तरह मौजूद है, जहां मैं ContainsKey (के समान कुछ कर सकते हैं), लेकिन ints की एक सूची में किसी भी के लिए जाँच?

+0

पंडिताऊ: सी # भी शब्दकोशों, ContainsAny की तरह बहुत कम विधियां नहीं हैं। .NET में शब्दकोश हैं और शायद ऐसी विधि हो सकती है। –

उत्तर

5

हाँ, आप सूचियों के लिए यह कोशिश कर सकते हैं:

people = people.Where(r => list.Intersect(r.CarIds).Count() != 0).ToList(); 

शब्दकोशों के लिए, आप इस का उपयोग कर सकते हैं:

people = people.Where(r => r.CarIds.Any(n => dictionary.ContainsKey(n))).ToList(); 
+0

धन्यवाद। एक चिमटा जैसा दिखता है कि मुझे सूची की ज़रूरत है। की.इंटरटेक्ट ने इसे एक डिक्शनरी – leora

+0

@leora अपडेट करने का प्रयास करें, इसे 'इंटरसेक्ट' से तेज़ काम करना चाहिए। – dasblinkenlight

+0

मैं आपके अपडेट किए गए उत्तर का पालन नहीं करता, ऐसा लगता है कि यह बूल लौट रहा है लेकिन आप एक कर रहे हैं! = 0 चेक। । – leora

6

आपका सर्वश्रेष्ठ दांव शायद डिक्शनरी (विस्तार करने के लिए है जो शायद एक है चाहिए ContainsAny() या ContainsAnyKey())।

public static bool ContainsAny<K, V>(
     this Dictionary<K, V> dict, IEnumerable<K> keys) 
{ 
    foreach(K key in keys) 
     if(dict.ContainsKey(key)) return true; 
    return false; 
} 

और इस रूप में linq'd जा सकता है:

public static bool ContainsAny<K, V>(
      this Dictionary<K, V> dict, IEnumerable<K> keys) 
    { return keys.Any(key => dict.ContainsKey(key)); } 
संबंधित मुद्दे