使用 Linq 进行数学统计

2024-03-24

我有一个收藏person对象(IEnumerable),每个人都有一个age财产。

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

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


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

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

当集合中没有非空值时,此实现返回 null,但如果您不喜欢可为 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));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Linq 进行数学统计 的相关文章

随机推荐