Dav*_*ave 3 c# parallel-processing task-parallel-library
我想将这个简单的for循环转换为并行循环。它遍历字符串数组(从文本文件读取的浮点数)并计算总和。
for (int i = 0; i < parts.Length; i++)
{
float tmp;
if (float.TryParse(parts[i], out tmp) || float.TryParse(parts[i].Replace('.', ','), out tmp))
total += tmp;
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
Parallel.For(0, parts.Length, i =>
{
float tmp;
if (float.TryParse(parts[i], out tmp) || float.TryParse(parts[i].Replace('.', ','), out tmp))
total += tmp;
});
Run Code Online (Sandbox Code Playgroud)
它返回一个浮点数,但是值是错误的。
我也尝试过这个。
Parallel.For<float>(0, parts.Count, () => 0, (i, loop, subtotal) =>
{
total += result[i];
return subtotal;
},
(x) => Interlocked.Add(ref sum, x)
);
Run Code Online (Sandbox Code Playgroud)
无法降低语法。
我也知道这听起来很荒谬,但是大多数示例都使用整数,最终它们使用了只接受int参数的Add方法,我显然不能使用它。
为了简化操作,请使用以下命令:
var total =
parts.AsParallel().Sum(x =>
{
float tmp;
if (float.TryParse(x, out tmp) || float.TryParse(x.Replace('.', ','), out tmp))
return tmp;
return 0;
});
Run Code Online (Sandbox Code Playgroud)
或使用 Parallel.For
var bag = new ConcurrentBag<float>(); //Will hold the sub total for each thread.
Parallel.For<float>(0, parts.Count, () => 0, (i, state, subtotal) =>
{
float tmp;
if (float.TryParse(parts[i], out tmp) || float.TryParse(parts[i].Replace('.', ','), out tmp))
subtotal += tmp;
return subtotal;
},
(x) => bag.Add(x));
var total = bag.Sum();
Run Code Online (Sandbox Code Playgroud)