接下来不在vb.net中循环

时间:2013-09-04 16:07:57

标签: asp.net-mvc vb.net function

我创建了一个函数:

Public Shared Function appid()
        Dim appidQ = From v In db_apps.app_users
                     Where v.NT_id = System.Environment.UserName
                     Select v
        For Each v In appidQ
            Return Convert.ToInt32(v.app_id)
        Next v
        Return appid()
    End Function

我正在尝试将每个app_id返回给用户将其放置在viewdata中(仅用于测试我最终将此信息放在cookie中。)现在这应该返回2条记录,因为我目前有2条记录,符合appidQ中指定的查询条件。在调试时,appidQ确实返回了两个记录。然而,当我再进一步时,“For Each”不会循环,所以虽然appidQ返回2条记录,但该函数只返回第一条记录。任何帮助将不胜感激。

更新

显然,返回appid()会导致它退出循环,这是我的新代码:

Public Shared Function appid()
    Dim appidQ = From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v
    For Each v In appidQ
        Dim var = v.app_id
    Next v
    Return appid()
End Function

但它仍然不能满足我的需要。我需要它来返回

的结果
For Each v In appidQ
  Dim var = v.app_id
Next v

4 个答案:

答案 0 :(得分:1)

你的循环中有一个Return语句。

Return位于函数级别,因此循环(和函数)将在循环中首次传递后退出。

你应该做那样的事(我不是VB人)。

Public Shared Function appid()
        Return (From v In db_apps.app_users
                     Where v.NT_id = System.Environment.UserName
                     Select v).ToList()
            .Select(Function(p)  Convert.ToInt32(p.app_id)).ToList()

    End Function

然后在你看来,如果你正在使用ViewData,那就是这样的。

For Each id As Int32 In CType(ViewData("foo"), List(Of Int32)
...
Next

答案 1 :(得分:1)

正如已经注意到的那样,应该在循环之后移动return语句以获得所有结果。

Public Shared Function appid() As List(Of Int32)
    Dim appidQ = From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v
    Dim result As New List(Of Int32)
    For Each v In appidQ
        result.Add(Convert.ToInt32(v.app_id))
    Next v
    Return result
End Function

编辑

从您的评论中可以看出,您需要的是列表的字符串表示形式。当你尝试ToString()扩展时,它会返回对象的名称(例如:System.Collections.Generic.List1[System.Int32]所以我不知道是否有更有效的方法,但这应该有效:

Public Shared Function appid() As String
    Dim appidQ = From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v

    'Create a String representation
    Dim stringList As New System.Text.StringBuilder
    Dim counter As Integer = 0
    For Each v In appidQ
        stringList.Append(v.app_id.ToString())

        'Separator
        If Not counter = appidQ.Count - 1 Then
            stringList.Append("; ")
        End If
        counter += 1
    Next
    Return stringList.ToString
End Function

答案 2 :(得分:0)

在循环内部,您Return,因此您完全退出该函数(特别是循环)。

如果您没有Return,则不会退出该功能,因此您将有机会继续循环播放。

答案 3 :(得分:0)

你真的应该有Option Strict On。由于我们不知道app_id的数据类型是什么,并且您有Option Strict Off,我们无法确定我们应该返回什么。

试试这个:

Public Shared Function appid()
    Return (From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v.app_id).ToList()
End Function

如果它是强类型的会更好,但这应该会给你你想要的结果。

编辑:如果你需要转换为Int32,试试这个:

Public Shared Function appid()
    Return (From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v).ToList()
        .Select(Function(p)  Convert.ToInt32(p.app_id)).ToList()

End Function