2010-08-04 11 views
42

पर समांतर फॉरएच मैं नए समानांतर का उपयोग करना चाहता हूं। एक कार्यशील के माध्यम से लूप को फ़ोरएच फ़ंक्शन का उपयोग करना और प्रत्येक पंक्ति पर क्रियाएं करना।डेटाटेबल

 System.Threading.Tasks.Parallel.ForEach(dt.Rows, drow => 
       { 
        ... 
        Do Stuff 
        ... 
       }); 

जब मैं नया कोड चल रहा त्रुटि मिलती है: इस कोड के लिए

 foreach(DataRow drow in dt.Rows) 
     { 
      ... 
      Do Stuff 
      ... 
     } 

: मैं नीचे दिए गए कोड में परिवर्तित करने कोशिश कर रहा हूँ

विधि के लिए प्रकार तर्क 'सिस्टम .Treading.Tasks.Parallel.ForEach (System.Collections.Generic.IEnumerable, System.Action) 'को उपयोग से अनुमानित नहीं किया जा सकता है। प्रकार तर्कों को स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें।

इसके लिए सही वाक्यविन्यास क्या है?

उत्तर

89

DataTable.RowsDataRowCollection देता है जो केवल IEnumerable लागू करता है, IEnumerable<DataRow> नहीं। DataTable पर AsEnumerable() विस्तार विधि (DataTableExtensions से) का उपयोग करने के बजाय:

Parallel.ForEach(dt.AsEnumerable(), drow => 
{ 
    ... 
    Do Stuff 
    ... 
}); 
+2

डी ओह! पंच के लिए मारो (केवल सेकंड द्वारा)! – JaredReisinger

+0

क्या यह एक्सटेंशन अन्य संग्रहों के लिए उपलब्ध होगा जो IENumerable लागू करते हैं? जैसे TreeNodeCollection? या मुझे यह एक्सटेंशन स्वयं बनाना होगा? –

+0

@ स्कॉट: आपको इसे स्वयं लिखना होगा - क्योंकि अन्यथा यह जानने के लिए नहीं है कि किस प्रकार का 'IEnumerable ' वापस लौटने के लिए, यदि आप देखते हैं कि मेरा क्या मतलब है। –

7

Parallel.ForEach() को उम्मीद है पहला तर्क एक IEnumerable <> प्रकार किया जाना है। DataTable.Rows नहीं है, लेकिन आप इसे AsEnumerable() एक्सटेंशन विधि के साथ एक में बदल सकते हैं। प्रयास करें:

... Parallel.ForEach(dt.AsEnumerable(), drow => ... 
6

यह स्वीकार किए जाते हैं जवाब से बेहतर है क्योंकि यह System.Data.DataSetExtensions को संदर्भित करने की जरूरत नहीं है:

Parallel.ForEach(dt.Rows.Cast<DataRow>(), dr => 

एक गैर सामान्य संग्रह के साथ foreach का उपयोग करने के लिए, आप उपयोग कर सकते इस उदाहरण में दिखाए गए अनुसार संग्रह को सामान्य संग्रह में कनवर्ट करने के लिए विस्तार विधि कास्ट करें।

+1

लेकिन इसे ध्यान में रखें , [कास्ट डॉक्स] से (https://msdn.microsoft.com/en-us/library/bb341406 (v = vs.110) .aspx): "यदि कोई तत्व TResult टाइप करने के लिए नहीं डाला जा सकता है, तो यह विधि फेंक देगी एक अपवाद। केवल उन तत्वों को प्राप्त करने के लिए जिन्हें TResult टाइप करने के लिए डाला जा सकता है, कास्ट (IENumerable) के बजाय OFType विधि का उपयोग करें। " – ALEXintlsos

0

मुझे इसे काम करने के लिए जॉन स्कीट के जवाब को संशोधित करना पड़ा।

Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => { 
    drow.SomeCol = ""; 
});