這聽起來我喜歡你的初始數據類型應採取的形式
Public Class EntityTableRow
Public Description As String
Public Activity As String
Public MonthCosts As IEnumerable(Of Decimal)
End Class
我會告訴你如何從IEnumerable(Of Decimal)
和組的順序選擇。這應該說明IEnumerable可以表示有序數據,取決於實現者。首先,我將擴展類定義。有重要的benefits when using immutable classes,你應該同意直接暴露你的成員變量沒有屬性被認爲是不好的做法。
Public Class EntityTableRow
Private ReadOnly _descritption As String
Private ReadOnly _activity As String
Private ReadOnly _monthCosts As IList(Of Decimal)
Public Sub New(_
ByVal description As String,
ByVal activity As String, _
ByVal monthCosts As IEnumerable(Of Decimal))
Me._description = description
Me._activity = activity
Me._monthCosts = New List(Of Decimal)(monthCosts)
End Sub
Public ReadOnly Property Description() As String
Get
Return Me._description
End Get
End Property
Public ReadOnly Property Activity() As String
Get
Return Me._activity
End Get
End Property
Public ReadOnly Property MonthCosts() As IEnumerable(Of Decimal)
Get
Return Me._monthCosts
End Get
End Property
End Class
可以看出,類僅公開IEnumerable(Of Decimal)
但這個順序並不代表有序數據。現在我將展示如何使用linq將IEnumerable(Of EntityTableRow)
中的數據分組。
首先,我將創建一些測試數據。
Dim testData As IEnumerable(Of EntityTableRow) = _
{
New EntityTableRow("A", "B", New Decimal() {20, 20, 20}),
New EntityTableRow("A", "B", New Decimal() {Nothing, 20, 20, 20}),
New EntityTableRow("C", "D", New Decimal() {10, 20, Nothing, 40}),
New EntityTableRow("C", "D", New Decimal() {50, 60})
}
在這一點上,我認爲accapet將IList
提供數據的稀少的人口提供更好的支持,但是,這不是在原來的問題定義。這些例子從一個單調地開始。
有幾種方法可以執行分組,我會將其分成三個簡單的步驟,我將易於遵循。請記住,這是所有懶評估。
首先,將數據扁平化爲月份級別,並將月份號碼合併到序列中。
Dim allCosts = testData.SelectMany(_
Function(r) r.MonthCosts.Select(_
Function(c, i) New With {r.Descriptionr, r.Activity, .Month = i, .Cost = c}))
請注意使用索引Select
擴展名來推斷訂單中的月份。
接下來,組,總和活動,描述和月費,
Dim groupedCosts = allCosts.GroupBy(_
Function(r) New With {r.Activity, r.Description, r.Month},
Function(k, s) New With
{
k.Description,
k.Activity,
k.Month,
.TotalCost = s.Sum(Function(r) r.Cost)
})
這實際上給你的信息需要,如果仍然希望可以通過描述和活動重新組合的幾個月裏,
Dim groupedDescriptionActivities = groupedCosts.GroupBy(_
Function(r) New With {r.Description, r.Activity}, _
Function(k, s) New With
{
k.Description,
k.Activity,
.MonthCosts = s.Select(Function(r) New With {r.Month, r.TotalCost})
})
如果您的成本價值是使用'雙'的財務是一個壞主意。 「小數」更適合。 – Jodrell 2013-03-19 17:26:49
「MonthCosts」字典中的Keys列表是否在來自同一組的項目之間有所不同? – MarcinJuraszek 2013-03-19 17:26:54