我需要一個包含一些對象的列表來計算。我可以在列表<T>中使用匿名類型而不是輔助類嗎?
我當前的代碼看起來像這樣
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;
}
現在我發現它有點難看只是介紹了我的計算(助手類)類型。 我的第一種方法是像我通常這樣使用Tuple<DateTime, TimeSpan, bool>
,但由於我需要在創建實例後修改TimeSpan,所以我不能使用Tuple,因爲Tuple.ItemX
是隻讀的。
我想到了一個匿名的類型,但我無法弄清楚如何初始化我的名單
var item1 = new { TheDate = DateTime.Now,
TheDuration = TimeSpan.Zero, Enabled = true };
var items = new List<?>(); // How to declare this ???
items.Add(item1);
匿名類型的字段是['readonly'](http://msdn.microsoft.com/en-us/library/bb397696.aspx) - 它們只能在施工過程中設置 - 所以不會比'Tuple'的想法。 –
btw,'result.Add'不會改變'result',但會返回一個新的'TimeSpan'。因此,當前的實現總是返回0. –
你是對的,我的真實世界的代碼做到了這一點。忘記在示例代碼中包含這些內容。 –