使用linq从日期列表中计算平均年龄

时间:2017-12-15 21:30:01

标签: c# 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

我应该将日期值转换为滴答,然后计算平均值吗?

4 个答案:

答案 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()不适用于DateTimeTimestamp类型,因此您可以按以下步骤操作:

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);