情况如下:我将大量数据存储在'mysamples'中作为以下数据结构。我需要对数据进行一些查询和报告工作,我是Linq的新手。首先,我需要编写一个Linq脚本来提取所有记录的月度年度报告。它总结了'mysamples'中所有样本的所有样本点(当前年份,按月分类)的“价值”。我可以在vb.net代码中轻松完成,但我意识到Linq是适合这种东西的正确工具。任何人都可以给我一些东西。谢谢。
<h1>Heading 1 value</h1>
答案 0 :(得分:1)
Dim sampleQ1 as New sample() With {.id ="2016Q1", .datapoints = New List(Of sampledatapoint)()}
sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 1, 1), .value = 1000})
sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 1, 10), .value = 2000})
sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 2, 1), .value = 500})
sampleQ1.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 3, 7), .value = 750})
Dim sampleQ2 as New sample() With {.id ="2016Q2", .datapoints = New List(Of sampledatapoint)()}
sampleQ2.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 4, 4), .value = 800})
sampleQ2.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2016, 4, 5), .value = 150})
Dim sampleQ4 as New sample() With {.id ="2015Q4", .datapoints = New List(Of sampledatapoint)()}
sampleQ4.datapoints.Add(New sampledatapoint() With {.time = New DateTime(2015, 10, 20), .value = 666})
Dim mysamples As New List(Of sample)
mysamples.Add((sampleQ1))
mysamples.Add((sampleQ2))
mysamples.Add((sampleQ4))
Dim q = From sdp In mysamples.SelectMany(Function(x) x.datapoints).Where(Function(x) x.time.Year = DateTime.Now.Year)
Group By grp = sdp.time.Month Into Group
Select New With {.Month = grp, .Sum = Group.Sum(Function(x) x.value)}
For Each monthlySum In q
Console.WriteLine("Month: {0}, Sum: {1}", monthlySum.Month, monthlySum.Sum)
Next
'Month: 1, Sum: 3000
'Month: 2, Sum: 500
'Month: 3, Sum: 750
'Month: 4, Sum: 950
SelectMany
可以解决问题。它将所有采样的所有采样点都展平为一个列表。 Group By
保持不变。
此外:您使用struct
代替class
是否有任何理由?我建议至少使用一个类sample
,因为它既不代表单个值,也不包含值类型。