foreach (var row in table.Rows) { DoSomethingWith(row); }
En supposant que je travaille avec un System.Data.DataTable
standard (qui contient une collection d’objects System.Data.DataRow
), la variable ‘row’ ci-dessus est résolue en tant que type d’ object
et non en tant que System.Data.DataRow
.
foreach (DataRow row in table.Rows) { DoSomethingWith(row); }
Fonctionne comme je m’y attendais. A-t-il une raison particulière pour ceci?
Merci.
En effet, Rows
est DataRowCollection
, qui est à son tour IEnumerable
et non IEnumerable
, ce qui signifie que le type inféré sera un object
.
Lorsque vous indiquez explicitement le type dans foreach
, vous indiquez à c # d’append un acteur à chaque appel, raison pour laquelle cela fonctionne.
Une dissortingbution implicite se produit. Notez également qu’une exception InvalidCastException peut être levée si le transfert n’est pas possible.
table.Rows
est un DataRowCollection qui est IEnumberable
(et non IEnumerable
, T étant DataRow
), il n’est donc pas fortement typé dans un DataRow
, mais un object, c’est-à-dire une collection d’objects.
Il existe cependant des extensions DataTable
que vous pouvez utiliser: http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx
foreach (var row in table.AsEnumerable()) { }
Essaye ça:
System.Data.DataTable dt = new System.Data.DataTable(); foreach (var row in dt.Rows.Cast()) { }
Pour utiliser Rows.Cast, vous devez utiliser System.Linq.