C#中Spliterator的等价物是什么?

What is the equivalent of Spliterator in C#?

在 Java 中,我可以编写一个 Spliterator 接口实现,在其中我可以指定如何将源集合拆分为子集合以进行并行处理。

但是我不明白如何在C#中做到这一点,我只知道你可以在IEnumerable上调用AsParallel,但是你能控制拆分过程吗?

例如,我的源集合是一个数组,我想将它分成 5 个项目子数组,并希望 linq 处理这些子数组。这可能吗?

如果您有特定的分区要求,您应该看看 Custom Partitioners for PLINQ and TPL and How to: Implement a Partitioner for Static Partitioning. These give an example of how you can implement a Partitioner<TSource>,它大概类似于 Java 的 Spliterator

然而,大多数时候,让框架选择自己的动态分区策略更为有利。如果你的需求是限制并发级别为5,可以使用WithDegreeOfParallelism:

var summary = ints
    .AsParallel()
    .WithDegreeOfParallelism(5)
    .Aggregate(
        seed: (
            count: 0,
            sum: 0,
            min: int.MaxValue,
            max: int.MinValue),
        updateAccumulatorFunc: (acc, x) => (
            count: acc.count + 1,
            sum: acc.sum + x,
            min: Math.Min(acc.min, x),
            max: Math.Max(acc.max, x)),
        combineAccumulatorsFunc: (acc1, acc2) => (
            count: acc1.count + acc2.count,
            sum: acc1.sum + acc2.sum,
            min: Math.Min(acc1.min, acc2.min),
            max: Math.Max(acc1.max, acc2.max)),
        resultSelector: acc => (
            acc.count,
            acc.sum,
            acc.min,
            acc.max,
            avg: (double)acc.sum / acc.count));

目前 C# 不像 Java 那样提供此功能。 C# 中的并行任务有一个 MaxDegreeOfParallelism 参数,可让您指定 ParallelOptions 实例启用的最大并发任务数,它会自动处理任务数。