我有一个日期列表,我想计算平均年龄。我不确定使用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
我应该将日期值转换为滴答,然后计算平均值吗?
答案 0 :(得分:3)
我应该将日期值转换为滴答,然后计算平均值吗?
不需要 - 您可以减去两个DateTimes
并获得一个TimeSpan
,它会以您想要的任何单位为您提供它们之间的差异。只需获取现在(或适当的参考日期)和每个项目的天数(包括分数)并平均它们:
double avgDays = list.Average(dt => (DateTime.Now - dt).TotalDays);
答案 1 :(得分:0)
您可以使用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));
答案 2 :(得分:0)
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);
答案 3 :(得分:-1)
使用扩展方法
public static TimeSpan Average(this IEnumerable<TimeSpan> spans) => TimeSpan.FromSeconds(spans.Select(s => s.TotalSeconds).Average());
您可以将年龄计算为TimeSpan
s并获得平均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
转换为你需要的任何单位:
var avgAgeInYears = (avgAge.TotalDays/365.2425);