我有一个收藏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(使用前将#替换为@)