gpt4 book ai didi

c# - 使用 Linq 进行数学统计

转载 作者:可可西里 更新时间:2023-11-01 07:48:41 24 4
gpt4 key购买 nike

我有一个 person 对象的集合 (IEnumerable),每个人都有一个 age 属性。

我想生成集合的统计数据,例如此年龄属性的最大值、最小值、平均值、中值等。

使用 LINQ 执行此操作的最优雅方法是什么?

最佳答案

这是 Median 的完整通用实现,它可以正确处理空集合和可为 null 的类型。它以 Enumerable.Average 的风格对 LINQ 友好,例如:

    double? medianAge = people.Median(p => p.Age);

当集合中没有非空值时,此实现返回 null,但如果您不喜欢可为空的返回类型,则可以轻松地将其更改为抛出异常。

public static double? Median<TColl, TValue>(
this IEnumerable<TColl> source,
Func<TColl, TValue> selector)
{
return source.Select<TColl, TValue>(selector).Median();
}

public static double? Median<T>(
this IEnumerable<T> source)
{
if(Nullable.GetUnderlyingType(typeof(T)) != null)
source = source.Where(x => x != null);

int count = source.Count();
if(count == 0)
return null;

source = source.OrderBy(n => n);

int midpoint = count / 2;
if(count % 2 == 0)
return (Convert.ToDouble(source.ElementAt(midpoint - 1)) + Convert.ToDouble(source.ElementAt(midpoint))) / 2.0;
else
return Convert.ToDouble(source.ElementAt(midpoint));
}

关于c# - 使用 Linq 进行数学统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134366/

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