2010-02-24 3 views
24

Y at-il une raison pour laquelle je ne peux pas faire ce qui suit:Pourquoi ne puis-je pas foreach (var Item dans DataTable.Rows)?

foreach (var Item in DataTable.Rows) { 

plutôt que d'avoir à faire

foreach (DataRow Item in DataTable.Rows) { 

j'aurais pensé que cela était possible, comme il est sur d'autres types de données. Par exemple:

foreach (var Employee in Staff) { // string[] Staff etc... 

Lorsque je tente la première boucle foreach, je reçois l'erreur CS0021: ne peut pas appliquer l'indexation avec [] à une expression de type « objet ».

Pourquoi le compilateur ne peut-il pas comprendre que .Rows renvoie une collection de DataRows?

Répondre

25

Rows retourne efficacement IEnumerable (DataRowCollection), de sorte que le compilateur ne peut choisir object que le type de var. Utilisez Rows.Cast<DataRow> si vous souhaitez utiliser var. Est défini sur Enumerable, donc vous devez inclure System.Linq.

+0

étaient-datatables avant génériques? –

+0

@Arnis: Absolument, DataTable a été dans 1.0. –

+0

Donc - je suppose que c'est la vraie raison. Ty Jon pour clarification. :) –

20

Brian est tout à fait raison sur la raison de cela, mais il y a un moyen plus simple de l'éviter: utiliser :

foreach (var row in DataTable.AsEnumerable()) 
{ 
    ... 
} 
+0

Je vous remercie pour une solution si chouette :) J'ai gardé la réponse acceptée comme Brian, mais utilisera le vôtre. Il est temps de lire un peu plus sur Enumerables ... – GateKiller

+8

Je dirais que la vraie solution au problème serait de ne pas utiliser var dans ce cas ... – cjk

+1

@ck: D'accord, mais ça vaut le coup de connaître 'AsEnumerable' afin de lier avec d'autres méthodes LINQ. –

Questions connexes