使用VB.NET 2008进行此分组的Linq代码是什么?

时间:2011-03-29 01:58:58

标签: .net vb.net linq visual-studio-2008 ienumerable

我的人口年龄介于0至119岁之间。

我希望根据以下假设将这一人群从15岁到49岁分组:

  1. 15至19;
  2. 20至24;
  3. 25至29;
  4. 30至34;
  5. 35至39;
  6. 40至44;
  7. 45至49。
  8. 除了这些年龄,这些对我需要执行的计算毫无用处。以下是一些示例数据和代码。

    我有一个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会如此复杂!?

    我的代码实际上是有效的,我只是在寻找一个更好的,也许更具可读性的解决方案,尽管这很容易理解我在这里想要实现的目标。

    无论如何,任何人都有关于如何使用它的线索?

    提前致谢! =)

1 个答案:

答案 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 */);