2008-09-01 19 views
15

मेरे पास List<int> और List<customObject> है। कस्टमऑब्जेक्ट क्लास में एक आईडी प्रॉपर्टी है। मैं List<customObject> कैसे प्राप्त कर सकता हूं जिसमें केवल वे ऑब्जेक्ट्स हैं जहां आईडी प्रॉपर्टी LINQ का उपयोग कर List<int> में है?संपत्ति मूल्य पर फ़िल्टर linq सूची

संपादित करें: मैंने Konrads जवाब स्वीकार किया क्योंकि यह पढ़ने के लिए आसान/अधिक सहज है।

उत्तर

16
var result = from o in objList where intList.Contains(o.ID) select o 
+0

लिंक 'नहीं' विधि अधिक संक्षिप्त नहीं है? (नीचे मेरा उत्तर देखें) –

+0

@RobinWinslow वैसे वे पूरी तरह से समकक्ष हैं, मेरा केवल क्वेरी अभिव्यक्ति वाक्यविन्यास का उपयोग करता है। मेरा संभावित रूप से अधिक पठनीय है - लेकिन मैं मानता हूं कि (कम से कम ज्यादातर मामलों में) मैं वास्तव में आपके संस्करण के साथ जाऊंगा, जैसा कि आपने कहा है, यह अधिक संक्षिप्त है। –

+0

वे तकनीकी रूप से समकक्ष हैं, लेकिन मुझे '.Where() 'विधि * बहुत * पढ़ने के लिए आसान लगता है। लेकिन निश्चित रूप से यह सिर्फ मेरी राय है। –

6

untested है, लेकिन यह कुछ इस तरह हो जाएगा:

var matches = from o in objList 
        join i in intList on o.ID equals i 
        select o; 

@Konrad बस का परीक्षण किया है, और यह काम करता है - मैं सिर्फ एक टाइपो मैं कहाँ लिखा था "i.ID" के बजाय था "मैं"।

2
बस संपूर्णता के लिए

(और शायद यह आसान है पढ़ने के लिए?), एक "जहां" मैट के समान "में शामिल होने" का उपयोग:

var matches = from o in customObjectList 
       from i in intList 
       where o.ID == i 
       select o; 
10

मैं एक ऐसी ही समस्या पड़ा है अभी और प्रयोग किया जाता समाधान के नीचे। यदि आपके पास पहले से ऑब्जेक्ट्स की सूची है तो आप int सूची में पाए गए सभी को हटा सकते हैं, केवल objList में मेल छोड़कर।

objList.RemoveAll(x => !intList.Contains(x.id)); 
0

कृपया ध्यान दें कि इसमें शामिल होने के बजाय शामिल होने का उपयोग तब नहीं होता जब सूची में वस्तुओं की गणना 49 से अधिक हो! आपको त्रुटि मिलेगी: Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries.

8
using System.Linq; 

objList.Where(x => intList.Contains(x.id)); 
संबंधित मुद्दे