LINQ

2010-04-15 13 views
21

में DataGridViewRowCollection ऑब्जेक्ट का उपयोग करना मैं विस्तार विधियों और लैम्ब्डा अभिव्यक्तियों का उपयोग कर LINQ अभिव्यक्ति में DataGridViewRowCollection का उपयोग करना चाहता हूं। दुर्भाग्यवश, एक्सटेंशन विधियां IEnumerable<T> के लिए हैं, जो DataGridViewRowCollection लागू नहीं होती है। अजीब बात यह है कि मैं SQL जैसी वाक्य रचना के साथ यहाँ LINQ का उपयोग कर सकते हैं:LINQ

IEnumerable<DataGridViewRow> lRows = from DataGridViewRow row in dgvGrid.Rows 
            select row; 

कि करने के बाद, मैं कर सकते हैं उपयोग LINQ विस्तार तरीके:

foreach (DataGridViewRow lRow in lRows.Where(row => row.index > 4)) { ... } 

वहाँ किसी भी तरह से मैं कर सकता है उस लंबे पहले वक्तव्य के बिना मेरे DataGridViewRowCollection को IEnumerable<> में परिवर्तित करें? वही बात DataGridViewCellCollection और DataGridViewColumnCollection पर लागू होती है।

ps। मैं .नेट फ्रेमवर्क का उपयोग कर रहा 3.5

उत्तर

30

हाँ, ऐसा करते हैं:

Cast<TResult>(IEnumerable) विधि मानक क्वेरी ऑपरेटरों लागू किया जा करने के लिए सक्षम बनाता है:

var rows = yourDataGridViewRowCollection 
       .Cast<DataGridViewRow>() 
       .Where(row => row.index > 4); 

यह Enumerable.Cast विस्तार विधि का उपयोग करता आवश्यक प्रकार की जानकारी की आपूर्ति करके गैर-जेनेरिक संग्रह पर संग्रह। उदाहरण के लिए, ArrayList को लागू नहीं करता है IEnumerable<T>, लेकिन ArrayList वस्तु पर Cast<TResult>(IEnumerable) फोन करके, मानक क्वेरी ऑपरेटरों तो अनुक्रम क्वेरी करने के लिए इस्तेमाल किया जा सकता।

+0

चमकदार। धन्यवाद। – Mashmagar

+2

रिकॉर्ड के लिए, 'ऑफ टाइप ()' भी एक व्यवहार्य विकल्प है। केवल अंतर यह है कि 'ऑफ टाइप' कुछ भी त्याग देगा जो इसे परिवर्तित नहीं कर सकता है, और 'कास्ट' अपवाद फेंक देगा। – Bobson

संबंधित मुद्दे