You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中是否存在针对向量的ParallelEnumerable.Sum等效实现?

针对向量的ParallelEnumerable并行求和方案

C#原生的ParallelEnumerable并没有提供直接支持System.Numerics.Vector2(或其他多分量数据结构)的Sum()扩展方法,但你可以通过Aggregate()方法实现单次调用的并行向量求和,完全满足遍历一次数据集完成多分量累加的需求。

直接使用Aggregate实现

你可以直接在并行查询链中调用Aggregate(),指定初始累加值(Vector2.Zero)和累加逻辑:

float GetWeightedValue(IEnumerable<Data> data)
{
    Vector2 sum = data.AsParallel()
        .Select(d => 
        {
            float value = CalculateValue(d);
            float weight = CalculateWeight(d);
            return new Vector2(value * weight, weight);
        })
        .Aggregate(Vector2.Zero, (accumulator, currentVector) => accumulator + currentVector);

    return sum.X / sum.Y;
}

Aggregate()在并行场景下会自动处理数据分区的局部累加,再合并所有分区的结果,既保证了并行效率,又避免了多次遍历数据集的开销。

封装为扩展方法(复用性更佳)

如果需要在多处使用向量的并行求和,可以封装一个自定义扩展方法,让代码和你期望的.Sum()写法完全一致:

public static class ParallelVectorExtensions
{
    public static Vector2 Sum(this ParallelQuery<Vector2> source)
    {
        return source.Aggregate(Vector2.Zero, (acc, vec) => acc + vec);
    }

    // 可扩展至其他向量类型
    public static Vector3 Sum(this ParallelQuery<Vector3> source)
    {
        return source.Aggregate(Vector3.Zero, (acc, vec) => acc + vec);
    }
}

使用这个扩展方法后,你的代码就可以按照最初的期望编写:

float GetWeightedValue(IEnumerable<Data> data)
{
    Vector2 sum = data.AsParallel()
        .Select(d => 
        {
            float value = CalculateValue(d);
            float weight = CalculateWeight(d);
            return new Vector2(value * weight, weight);
        })
        .Sum();

    return sum.X / sum.Y;
}

注意事项

  • System.Numerics中的向量类型(如Vector2)是值类型,其+运算为纯函数操作,不存在线程安全问题,适合并行累加。
  • 若使用自定义多分量结构体,需确保其加法运算逻辑是无副作用的纯函数,避免并行场景下的异常。

内容的提问来源于stack exchange,提问作者thebarryman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:58:20