这听起来我喜欢你的初始数据类型应采取的形式
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