Параллельный 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)" не могут быть выведены из использования. Попробуйте явно указать аргументы типа.
Каков правильный синтаксис для этого?
Ответы
Ответ 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 = "";
});