2010-05-07 16 views
17

जब मैं इस foreach बयान दर्ज ...वैर सिस्टम का मूल्यांकन क्यों करता है। "Foreach (तालिका में पंक्तियों में पंक्ति) पंक्ति में"।

foreach (var row in table.Rows) 

... वर के लिए टूलटिप कहते class System.Object

मैं उलझन में हूँ क्यों यह class System.Data.DataRow नहीं है।

(मामले में आप सोच रहे हैं कि, हाँ, मैं अपने कोड फ़ाइल के शीर्ष पर using System.Data की है।)


अगर मैं प्रकार स्पष्ट रूप से घोषणा में ...

foreach (DataRow row in table.Rows) 
के रूप में

... यह कोई त्रुटि के साथ ठीक काम करता है।


इसके अलावा, अगर मैं ऐसा ...

var numbers = new int[] { 1, 2, 3 }; 
foreach (var number in numbers) 

... वर struct System.Int32 मूल्यांकन करता है। तो, समस्या यह नहीं है कि varforeach खंड में काम नहीं करता है।


तो, वहाँ कुछ अजीब के बारे में DataRowCollection जहां आइटम स्वचालित रूप से DataRow का मूल्यांकन नहीं है। लेकिन मैं यह नहीं समझ सकता कि यह क्या है। क्या किसी के पास स्पष्टीकरण है?


अद्यतन

मैं वास्तव में फटे किया गया, जिसमें चिह्नित करने के लिए (Codeka और ओलिवर) का जवाब ... अंत में, मैं, क्योंकि यह वास्तव में मेरे सवाल का जवाब Codeka के चिह्नित करने के लिए फैसला किया, लेकिन ओलिवर उत्तर देता है सवाल मुझे पूछना चाहिए था :)

उत्तर

17

ऐसा इसलिए है क्योंकि DataRowCollection कक्षा केवल IEnumerable के गैर-सामान्य संस्करण को लागू करती है। तो संकलक नहीं जानता कि चर का प्रकार क्या है।

स्पष्ट रूप से उस प्रकार को डालने से, आप मूल रूप से संकलक को object से DataRow पर स्पष्ट कास्ट उत्पन्न करने के लिए कहते हैं।

जेनिक्स उपलब्ध होने से पहले, यह .NET 1.x दिनों में जोड़े गए कई संग्रहों और वर्गों के साथ मिल जाएगा।

12

जबकि कोडेका सही है, इस DataTable और DataRow सामान में अधिक सुविधा प्राप्त करने के लिए कुछ अन्य विधियां मौजूद हैं।

.NET 3.5 के साथ आप असेंबली System.Data.DataSetExtensions जोड़ सकते हैं।

int columnIndex = 2; 

foreach(var row in MyDataTable.AsEnumerable()) 
{ 
    var content = row.Field<double>(columnIndex); 
} 
+0

महान बिंदु:

यह AsEnumerable(this System.Data.DataTable) या Field<T>(this System.Data.DataRow, int) इसके साथ जैसे कुछ विस्तार कार्यों आप एक foreach पाश के भीतर इसे कहते और स्तंभ उचित प्रकार में सीधे डाल सकता शामिल हैं! +1 –

+0

इस उत्तर को प्यार करें। +1 – wonea

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