Параллельный ForEach на DataTable - PullRequest
48 голосов
/ 04 августа 2010

Я хотел бы использовать новую функцию Parallel.ForEach для циклического перебора данных и выполнения действий в каждой строке. Я пытаюсь преобразовать код ниже:

        foreach(DataRow drow in dt.Rows)
        {
           ...
           Do Stuff
           ...
        }

К этому коду:

        System.Threading.Tasks.Parallel.ForEach(dt.Rows, drow =>
                {
                    ...
                    Do Stuff
                    ...
                });

Когда я запускаю новый код, я получаю сообщение об ошибке:

Аргументы типа для метода 'System.Threading.Tasks.Parallel.ForEach (System.Collections.Generic.IEnumerable, System.Action)' не могут быть получены из использования. Попробуйте указать аргументы типа явно.

Какой правильный синтаксис для этого?

Ответы [ 4 ]

101 голосов
/ 04 августа 2010

DataTable.Rows возвращает DataRowCollection, который реализует только IEnumerable, а не IEnumerable<DataRow>. Вместо этого используйте метод расширения AsEnumerable() для DataTable (из DataTableExtensions):

Parallel.ForEach(dt.AsEnumerable(), drow =>
{
    ...
    Do Stuff
    ...
});
11 голосов
/ 12 октября 2016

Это лучше, чем принятый ответ, потому что для этого не нужно ссылаться на System.Data.DataSetExtensions:

 Parallel.ForEach(dt.Rows.Cast<DataRow>(), dr =>

Чтобы использовать ForEach с неуниверсальной коллекцией, вы можете использовать метод расширения Cast для преобразования коллекции в универсальную коллекцию, как показано в этом примере.

8 голосов
/ 04 августа 2010

Parallel.ForEach () ожидает, что первый аргумент будет иметь тип IEnumerable <>.DataTable.Rows нет, но вы можете превратить его в единицу с помощью метода расширения AsEnumerable ().Попробуйте:

... Parallel.ForEach(dt.AsEnumerable(), drow => ...
1 голос
/ 13 декабря 2017

Мне пришлось изменить ответ Джона Скита, чтобы он заработал.

Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => {
     drow.SomeCol = "";
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...