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?

45
demandé sur SchwartzE 2010-08-04 22:25:11

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
    ...
});
97
répondu Jon Skeet 2010-08-04 18:27:44

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 => ...
7
répondu JaredReisinger 2010-08-04 18:47:44

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.

7
répondu Kevin .NET 2017-08-17 19:34:29

J'ai dû modifier la réponse de Jon Skeet pour que cela fonctionne.

Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => {
     drow.SomeCol = "";
});
0
répondu irfandar 2017-12-13 13:24:09