我可以在list中使用匿名类型吗?而不是助手类
本文关键字:类型 list 我可以 | 更新日期: 2023-09-27 17:53:25
我需要一个包含一些对象的列表来进行计算。
我当前的代码是这样的
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;
}
现在我发现仅仅为我的计算引入一个类型(HelperClass)有点难看。我的第一种方法是使用Tuple<DateTime, TimeSpan, bool>
,就像我通常这样做,但因为我需要在创建实例后修改TimeSpan,我不能使用Tuple,因为Tuple.ItemX
是只读的。
我想到了一个匿名类型,但是我不知道如何初始化我的List
var item1 = new { TheDate = DateTime.Now,
TheDuration = TimeSpan.Zero, Enabled = true };
var items = new List<?>(); // How to declare this ???
items.Add(item1);
对我来说,使用投影看起来像是前进的方向-但是您可以通过将集合本身"压缩"并偏移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
调用过滤掉禁用的对。Aggregate
调用对结果对的持续时间求和。
您可以使用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();
但是在这一点上,Tuple
既更可读又更简洁!