У меня есть неопределенное количество элементов (меньше длинного размера), для которых я должен выполнить некоторое количество вычислений во время выполнения для некоторых из них (операции, которые нужно выполнить, и для каких позиций элементов что-то получено в качестве аргумента).
Значения аргументов, количество позиций и инструкции списка (добавьте это к позициям, идущим от X к Y, вычтите это к позициям от P к Q)
Решение, которое у меня было было:
- Заполните
List<long> Output
нулями в соответствии с длиной, полученной аргументами; long output[] = Output.ToArray();
Instructions.ForEach(op => DoOperations(op));
(где op
имел, с какой позиции до какой позиции я должен делать, какие вычисления с какими числами)
A for
выполняет вычисления для каждой из отфильтрованных позиций output[]
.
Теперь дело в том, что ограничение по времени делает все это нежизнеспособным, поэтому мне нужен асинхронный вызов / когда все в действии, но также мне нужно, чтобы все они разделяли output
, чтобы они все могли работать с ним, не проблема, какая операция решается первой. И в Asyn нет параметров ref
или out
c.
Какой самый эффективный и чистый способ сделать это?
@ Изменить на показать, как работает параллель:
static long arrayManipulation(int n, int[][] queries)
{
long[] operate;
for(long i=0;i<n;i++)
lOperate.Add(0);
operate = lOperate.ToArray();
List<int[]> lQueries = new List<int[]>(queries.ToList<int[]>());
Parallel.ForEach(lQueries, op=>
{
Parallel.For(op[0]-1, op[1], i=> (operate[i]+= (long)op[2]));
});
return operate.Max();
}