gpt4 book ai didi

c# - C# linq 是否有类似于 SummaryStatistics 的东西?

转载 作者:太空狗 更新时间:2023-10-30 00:06:49 26 4
gpt4 key购买 nike

在 Java 中我可以这样做:

List<String> stringList = getRandomStrings(100_000, 1000);
IntSummaryStatistics stats =
stringList.stream()
.filter(Objects::nonNull)
.mapToInt(String::length)
.summaryStatistics();

System.out.println(stats);

输出是:

IntSummaryStatistics{count=100000, sum=49868013, min=0, average=498.680130, max=999}

linq 是否具有相同的功能?还是我必须单独计算所有内容?

Java 一次性完成,在 C# 中看起来您必须计算所有成分 Average()Count()Sum( ), Min()Max() 分别。

最佳答案

我不知道 .NET 中是否有任何内置功能具有等效功能,但您可以使用 LINQ 中的 Aggregate 自己轻松实现它。这满足您只枚举一次源集合的要求。

var ints = new List<int>() { 1, 2, 3, 4, 677, 8 };

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

Console.WriteLine(
$"count = {summary.count}, " +
$"sum = {summary.sum}, " +
$"min = {summary.min}, " +
$"max = {summary.max}, " +
$"average = {summary.avg}");

如果你的集合非常大并且你想并行处理它,你可以使用这个重载:

var summary = ints.AsParallel().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# - C# linq 是否有类似于 SummaryStatistics 的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52026650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com