简体   繁体   English

IOrderedEnumerable到vb.net IOrderedEnumerable转换

[英]IOrderedEnumerable to vb.net IOrderedEnumerable Conversion

Private Sub UpdateListBox(message As String)
    Dim beeGroups As IOrderedEnumerable(Of IGrouping(Of BeeState, Bee)) = From beeGroup In From bee In Me.world.BeesGroup bee By bee.CurrentStateOrder By beeGroup.KeybeeGroup
    Me.listBox1.Items.Clear()

    For Each beeGroup As IGrouping(Of BeeState, Bee) In beeGroups
        Dim s As String
        s = If(beeGroup.Count() = 1, String.Empty, "s")

        Me.listBox1.Items.Add(Convert.ToString(beeGroup.Key) & ": " & beeGroup.Count() & " bee" & s)

        If beeGroup.Key <> BeeState.Idle OrElse beeGroup.Count() <> Me.world.Bees.Count() OrElse Me.framesRun <= 0 Then
            Continue For
        End If

        Me.listBox1.Items.Add("Simulation ended: all bees are idle")
        Me.toolStripButtonStartSimulation.Text = "Simulation ended."
        Me.statusStrip1.Items(0).Text = "Simulation ended"
        Me.timer1.Enabled = False
    Next
End Sub    

I'm absolutely stuck at this error in the conversion of a c# project to vb.net . 在将c#项目转换为vb.net我绝对会卡在此错误中。

I know in c# it goes like this 我知道在c#会像这样

IOrderedEnumerable<IGrouping<BeeState, Bee>> beeGroups = from bee in this.world.Bees
                                                                 group bee by bee.CurrentState
                                                                 into beeGroup orderby beeGroup.Key select beeGroup;    

But once converted into vb.net it tries to state everything on one line with the fewest amount of declarations. 但是一旦转换为vb.net它将尝试以最少的声明在一行上声明所有内容。

While also in c# you can get away with c# : 虽然在c#也可以使用c#

foreach (IGrouping<BeeState, Bee> beeGroup in beeGroups)    

vb.net tries to declare the for statement within itself: vb.net尝试在其内部声明for语句:

For Each group As var In beeGroups    
Private Sub UpdateListBox(message As String)
    Dim beeGroups = From bee In Me.world.Bees
                    Group By bee.CurrentState Into beeGroup = Group
                    Order By beeGroup.Key

    Me.listBox1.Items.Clear()

    For Each beeGroup In beeGroups
        Dim beeCount = beeGroup.Count ' to avoid reevaluation
        Dim s = If(beeCount >= 1, String.Empty, "s")

        Me.listBox1.Items.Add(Convert.ToString(beeGroup.Key) & ": " & beeCount & " bee" & s)

        If beeGroup.Key <> BeeState.Idle OrElse beeCount <> Me.world.Bees.Count OrElse Me.framesRun <= 0 Then
            Continue For
        End If

        Me.listBox1.Items.Add("Simulation ended: all bees are idle")
        Me.toolStripButtonStartSimulation.Text = "Simulation ended."
        Me.statusStrip1.Items(0).Text = "Simulation ended"
        Me.timer1.Enabled = False
    Next
End Sub

Your 'For Each' statement is correct (both your C# and VB versions declare the iterator variable within the loop header), however the VB LINQ query should be: 您的“ For Each”语句正确(您的C#和VB版本都在循环头中声明了迭代器变量),但是VB LINQ查询应为:

Dim beeGroups As IOrderedEnumerable(Of IGrouping(Of BeeState, Bee)) = From bee In Me.world.Bees
                                                                      Group bee By bee.CurrentState Into beeGroup = Group
                                                                      Order By CurrentState
                                                                      Select beeGroup

Or user Option Infer On: 或用户选项推断:

Dim beeGroups = From bee In Me.world.Bees
                Group bee By bee.CurrentState Into beeGroup = Group
                Order By CurrentState
                Select beeGroup

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM