Подтвердить что ты не робот

Параллельный forEach в DataTable

Я хотел бы использовать новую функцию 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)" не могут быть выведены из использования. Попробуйте явно указать аргументы типа.

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

4b9b3361

Ответ 1

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

Parallel.ForEach(dt.AsEnumerable(), drow =>
{
    ...
    Do Stuff
    ...
});

Ответ 2

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

... Parallel.ForEach(dt.AsEnumerable(), drow => ...

Ответ 3

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

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

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

Ответ 4

Мне пришлось изменить ответ Jon Skeet, чтобы он работал.

Parallel.ForEach(dt.AsEnumerable<DataRowType>(), drow => {
     drow.SomeCol = "";
});