C# 我可以在列表中使用匿名类型而不是帮助器类吗?

C# 我可以在列表中使用匿名类型而不是帮助器类吗?,c#,generics,anonymous-types,C#,Generics,Anonymous Types,我需要一份清单,上面有一些计算用的对象 我当前的代码如下所示 private class HelperClass { public DateTime TheDate {get;set;} public TimeSpan TheDuration {get;set;} public bool Enabled {get;set;} } private TimeSpan TheMethod() { // create entries for every date

我需要一份清单,上面有一些计算用的对象

我当前的代码如下所示

private class HelperClass
{
    public DateTime TheDate {get;set;}
    public TimeSpan TheDuration {get;set;}
    public bool Enabled {get;set;}
}

private TimeSpan TheMethod()
{
    // create entries for every date
    var items = new List<HelperClass>();
    foreach(DateTime d in GetAllDatesOrdered())
    {
        items.Add(new HelperClass { TheDate = d, Enabled = GetEnabled(d), });
    }

    // calculate the duration for every entry
    for (int i = 0; i < items.Count; i++)
    {
        var item = items[i];
        if (i == items.Count -1) // the last one
            item.TheDuration = DateTime.Now - item.TheDate;
        else
            item.TheDuration = items[i+1].TheDate - item.TheDate;
    }

    // calculate the total duration and return the result
    var result = TimeSpan.Zero;
    foreach(var item in items.Where(x => x.Enabled))
        result = result.Add(item.TheDuration);
    return result;
}
你可以用LINQ这样做:

var itemsWithoutDuration = GetAllDatesOrdered()
    .Select(d => new { TheDate = d, Enabled = GetEnabled(d) })
    .ToList();
var items = itemsWithoutDuration
    .Select((it, k) => new { TheDate = it.d, Enabled = it.Enabled, 
         TheDuration = (k == (itemsWithoutDuration.Count - 1) ? DateTime.Now : itemsWithoutDuration[k+1].TheDate) - it.TheDate })
    .ToList();
但到那时,元组不仅更具可读性,而且更简洁

你可以用LINQ来做,比如:

var itemsWithoutDuration = GetAllDatesOrdered()
    .Select(d => new { TheDate = d, Enabled = GetEnabled(d) })
    .ToList();
var items = itemsWithoutDuration
    .Select((it, k) => new { TheDate = it.d, Enabled = it.Enabled, 
         TheDuration = (k == (itemsWithoutDuration.Count - 1) ? DateTime.Now : itemsWithoutDuration[k+1].TheDate) - it.TheDate })
    .ToList();

但到那时,元组不仅更具可读性,而且更简洁

对我来说,使用投影看起来像是一条前进的道路——但是你可以在前进的过程中计算持续时间,通过压缩你的集合本身,将其偏移1。然后,您可以在一个查询中执行整个方法:

// Materialize the result to avoid computing possibly different sequences
var allDatesAndNow = GetDatesOrdered().Concat(new[] { DateTime.Now })
                                      .ToList();

return allDatesNow.Zip(allDatesNow.Skip(1),
                       (x, y) => new { Enabled = GetEnabled(x),
                                       Duration = y - x })
                  .Where(x => x.Enabled)
                  .Aggregate(TimeSpan.Zero, (t, pair) => t + pair.Duration);

Zip调用将每个日期与其后续日期配对,将每对值转换为持续时间和启用标志。Where调用过滤掉禁用的对。聚合调用对结果对的持续时间求和。

对我来说,使用投影看起来像是前进的方向-但您可以在前进的过程中计算持续时间,方法是将集合本身压缩,偏移1。然后,您可以在一个查询中执行整个方法:

// Materialize the result to avoid computing possibly different sequences
var allDatesAndNow = GetDatesOrdered().Concat(new[] { DateTime.Now })
                                      .ToList();

return allDatesNow.Zip(allDatesNow.Skip(1),
                       (x, y) => new { Enabled = GetEnabled(x),
                                       Duration = y - x })
                  .Where(x => x.Enabled)
                  .Aggregate(TimeSpan.Zero, (t, pair) => t + pair.Duration);


Zip调用将每个日期与其后续日期配对,将每对值转换为持续时间和启用标志。Where调用过滤掉禁用的对。聚合调用对结果对的持续时间求和。

匿名类型的字段是-它们只能在构造期间设置-因此不比元组idea好。顺便说一句,result.Add不是变异结果,而是返回一个新的时间跨度。因此,当前的实现总是返回0。你是对的,我的真实代码做得很好。忘记将其包含在示例代码中。匿名类型的字段是-它们只能在构造过程中设置-因此并不比Tuple idea.btw,result.Add更好,它不是变异结果,而是返回一个新的时间跨度。因此,当前的实现总是返回0。你是对的,我的真实代码做得很好。忘了在示例代码中包含它。但是OP需要另一个属性,Duration,它是计算出来的later@mikez:谢谢,我错过了。我添加了一个默认值,这样匿名类就有了一个占位符,以后可以更新。我以前从未尝试过修改它们,所以我想我没有意识到这一点。当您按照我最新的编辑方法解决它时,它比原来的元组糟糕得多。@DocMax:但不一定非得如此-请参阅我的答案:但OP需要另一个属性,即计算的持续时间later@mikez:谢谢,我错过了。我添加了一个默认值,这样匿名类就有了一个占位符,以后可以更新。我以前从未尝试过修改它们,所以我想我没有意识到这一点。根据我最新的编辑,当你解决这个问题时,它比原来的元组要糟糕得多。@DocMax:不过也不必如此-请看我的答案:Concat的参数不是IEnumerable吗?您可能是指new[]{DateTime.Now}或类似内容。@mikez:哇,是的-将修复+1,因为您还修复了原始版本中始终返回0的错误。不知道Zip函数。谢谢。康卡特的论点不是数不清的吗?您可能是指new[]{DateTime.Now}或类似内容。@mikez:哇,是的-将修复+1,因为您还修复了原始版本中始终返回0的错误。不知道Zip函数。谢谢