Foreach parallèle sur DataTable
Je voudrais utiliser le nouveau parallèle.ForEach fonction pour faire une boucle à travers un datatable et effectuer des actions sur chaque ligne. J'essaie de convertir le code ci-dessous:
foreach(DataRow drow in dt.Rows)
{
...
Do Stuff
...
}
À ce code:
System.Threading.Tasks.Parallel.ForEach(dt.Rows, drow =>
{
...
Do Stuff
...
});
Quand je lance le nouveau code j'obtiens l'erreur:
les arguments de type pour la méthode ' System.Le filetage.Tâche.Parallèle.ForEach(Système D'.Collection.Générique.IEnumerable, Système.Action) ' ne peut pas être déduit de l'utilisation. Essayez de spécifier explicitement les arguments de type.
Quelle est la syntaxe correcte pour cela?
4 réponses
DataTable.Rows
retourne un DataRowCollection
, qui n'implémente IEnumerable
, pas IEnumerable<DataRow>
. L'utilisation de la AsEnumerable()
méthode d'extension sur DataTable
(à partir de DataTableExtensions
) à la place:
Parallel.ForEach(dt.AsEnumerable(), drow =>
{
...
Do Stuff
...
});
Parallèle.ForEach () s'attend à ce que le premier argument soit un type IEnumerable. DataTable.Rows ne l'est pas, mais vous pouvez le transformer en un avec la méthode d'extension AsEnumerable (). Essayez:
... Parallel.ForEach(dt.AsEnumerable(), drow => ...
C'est mieux que la réponse acceptée car cela n'a pas besoin de référencer le système.Données.Données d'extension:
Parallel.ForEach(dt.Rows.Cast<DataRow>(), dr =>
Pour utiliser ForEach avec une collection non générique, vous pouvez utiliser la méthode D'extension Cast pour convertir la collection en une collection générique, comme indiqué dans cet exemple.
J'ai dû modifier la réponse de Jon Skeet pour que cela fonctionne.
Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => {
drow.SomeCol = "";
});