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 实例启用的最大并发任务数,它会自动处理任务数。
在 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 实例启用的最大并发任务数,它会自动处理任务数。