[英]Calculate Average Age from a list of dates using linq
我有要计算平均年龄的日期列表。 我不确定使用LINQ的最佳方法是什么。
2017-04-13 08:31:00.000
2017-04-12 07:53:00.000
2017-04-11 07:59:00.000
2017-04-10 08:16:00.000
2017-04-09 15:11:00.000
2017-04-08 08:28:00.000
2017-04-06 08:26:00.000
我应该将日期值转换为刻度,然后计算平均值吗?
我应该将日期值转换为刻度,然后计算平均值吗?
不需要-您可以减去两个DateTimes
并获得一个TimeSpan
,这将为您提供所需的任何单位之间的差异。 只需获取从现在(或任何合适的参考日期)到每一项之间的天数(包括分数),然后将它们平均即可:
double avgDays = list.Average(dt => (DateTime.Now - dt).TotalDays);
您可以使用LINQ的平均功能。
IEnumerable<DateTime> timeSpan = new List<DateTime>()
{
DateTime.Parse("2017-04-13 08:31:00.000"),
DateTime.Parse("2017-04-12 07:53:00.000"),
DateTime.Parse("2017-04-11 07:59:00.000"),
DateTime.Parse("2017-04-10 08:16:00.000"),
DateTime.Parse("2017-04-09 15:11:00.000")
};
DateTime average = new DateTime((long)timeSpan.Average(x => x.Ticks));
DateTime
内部, DateTime
由特定的刻度数表示,可以使用Ticks
属性检索。 由于Enumerable.Average()
不适用于DateTime
和Timestamp
类型,因此可以按以下步骤进行操作:
List<DateTime> dates = new List<DateTime>()
{
DateTime.ParseExact("2017-04-13 08:31:00.000", "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture),
DateTime.ParseExact("2017-04-12 07:53:00.000", "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture),
DateTime.ParseExact("2017-04-11 07:59:00.000", "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture),
DateTime.ParseExact("2017-04-10 08:16:00.000", "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture),
DateTime.ParseExact("2017-04-09 15:11:00.000", "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture)
};
Int64 avgTicks = (Int64)dates.Select(d => d.Ticks).Average();
DateTime avgDate = new DateTime(avgTicks);
如果用“年龄”表示年份,并且您希望与本年度的区别,那么:
Int32 avgYear = DateTime.Now.Year - avgDate.Year;
如果您希望绝对不同:
Int32 avgYear = Math.Abs(DateTime.Now.Year - avgDate.Year);
使用扩展方法,
public static TimeSpan Average(this IEnumerable<TimeSpan> spans) => TimeSpan.FromSeconds(spans.Select(s => s.TotalSeconds).Average());
您可以将年龄计算为TimeSpan
并获得平均TimeSpan:
var now = DateTime.Now; // don't slide the ages by computational time
var avgAge = birthDates.Select(d => now - d).Average();
或手动扩展扩展方法:
var avgAge = TimeSpan.FromSeconds(birthDates.Select(d => (now - d).TotalSeconds).Average());
然后,您可以使用将avgAge
转换为avgAge
的任何单位:
var avgAgeInYears = (avgAge.TotalDays/365.2425);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.