我的人口年龄介于0至119岁之间。
我希望根据以下假设将这一人群从15岁到49岁分组:
除了这些年龄,这些对我需要执行的计算毫无用处。以下是一些示例数据和代码。
我有一个AnnualPopulation类,代表每个年龄段的人口统计数据。
Public Class AnnualPopulation
Public Id as Integer
Public Year As Integer
Public Gender As String
Public YearsOfAge As Double?() = New Double?(119) { }
End Class
然后,YearsOfAge数组/集合属性包含基于其性别的人数。例如:
AnnualPopulation.Year = 2009
AnnualPopulation.Gender = "F"c
For age As Integer = 0 To AnnualPopulation.YearsOfAge.Length - 1 Step 1
YearsOfAge(age) = 42356.67F 'Of course, this number varies from a years of age to another!'
Next
然后我想分组如下:
Dim groups() As Double = New Double(6) { }
For age As Integer = 15 To 49 Step 1
Dim index As Integer = 0
Select Case age
Case 15 to 19
index = 0
Case 20 To 24
index = 1
Case 25 To 29
index = 2
Case 30 To 34
index = 3
Case 35 To 39
index = 4
Case 40 To 44
index = 5
Case 45 To 49
index = 6
End Select
groups(index) += AnnualPopulation.YearsOfAge(age - 1)
Next
这样,每个年龄段的人口总和
所以,我虽然对它们进行分组,然后我没有共同的密钥将它们分组,没有运气! = P在C#中,我想这会做我需要的:
double[] groups = new double[7];
Enumerable.Range(15, 34).ToList().ForEach(age => {
groups[(int)(age % 4)] += annualPopulation.YearsOfAge[age - 1].HasValue
? annualPopulation.YearsOfAge[age - 1].Value : 0.0;
});
我似乎无法在VB.NET 2008中实现,除非我尝试使用New Action(Of T1, T2)
或Func(Of Double?, TKey)
。我对这些都不满意! =((底层问题:为什么在VB.NET中使用lambdas会如此复杂!?)
我的代码实际上是有效的,我只是在寻找一个更好的,也许更具可读性的解决方案,尽管这很容易理解我在这里想要实现的目标。
无论如何,任何人都有关于如何使用它的线索?
提前致谢! =)
答案 0 :(得分:1)
在分组选择器中使用您的switch
语句;键分别为0到6。之后,您只需在每个组中使用Sum
运算符。
在C#中,它看起来像这样(你在C#中没有远程case
):
var filtered = data
.Where(item => item.Age > 15 && item.Age <= 49)
.GroupBy(item =>
{
if(item.Age > 15 && item.Age <= 19)
return 0;
else if(item.Age <= 24)
return 1;
else if(item.Age <= 29)
return 2;
else if(item.Age <= 34)
return 3;
else if(item.Age <= 39)
return 4;
else if(item.Age <= 44)
return 5;
else if(item.Age <= 49)
return 6;
});
之后,您可以创建字典:
var dict = filtered.ToDictionary(i => i.Key, i => /* do something with the sequence */);