代码之家  ›  专栏  ›  技术社区  ›  Rowan Freeman

如何在LINQ查询表达式中设置局部变量?

  •  2
  • Rowan Freeman  · 技术社区  · 11 年前

    如何递增 counter 在LINQ查询中?

    考虑以下内容

    Public Class SimpleString
        Public Property Value As String
    End Class
    

    ...

    Public Shared Sub SetStuff()
    
        Dim stringList As IEnumerable(Of SimpleString) =
            {New SimpleString With {.Value = "0"},
             New SimpleString With {.Value = "0"},
             New SimpleString With {.Value = "0"},
             New SimpleString With {.Value = "0"},
             New SimpleString With {.Value = "0"}}
    
        Dim counter As Integer = 0
    
        Dim newIntegerList As IEnumerable(Of SimpleString) =
            (From i In stringList
            Select New SimpleString With
                {
                    .Value = (counter = counter + 1).ToString
                })
    End Sub
    

    以上内容不起作用。

    规则:

    • 没有C#(我知道它可以用C#完成,但这是VB.NET)
    • 没有方法语法(我的查询很复杂,所以最好使用查询语法)
    • 没有ToList或List(Of)(我在应用程序中的任何地方都不使用List,为了保持一致性,我宁愿不启动。此外,IEnumerable意味着在必要之前不会执行查询)
    • 没有循环(我不使用具体的类。还有一致性,因为我尽量减少循环的使用,主要使用LINQ)
    2 回复  |  直到 11 年前
        1
  •  1
  •   MarcinJuraszek    11 年前

    由于VB.NET中的赋值运算符和等于运算符完全相同,因此不能执行以下VB.NET等效操作:

    Value = (counter = counter + 1).ToString()
    

    增加变量并将其打印为字符串。

    然而,您可以编写一个helper方法,该方法接受 Integer ByRef ,将其递增并返回:

    Public Function Increment(ByRef value As Integer) As Integer
        value = value + 1
        Return value
    End Function
    

    并在查询中使用它:

    Dim newIntegerList As IEnumerable(Of SimpleString) =
        (From i In stringList
        Select New SimpleString With
            {
                .Value = Increment(counter).ToString
            })
    

    但我不得不说, 我真的不理解你 规则 完全

        2
  •  0
  •   Community CDub    7 年前

    只是为了好玩,除了 Marcin's correct answer ,可以使用枚举器并使用 Let -条款:

    Dim gen = Enumerable.Range(1, Int32.MaxValue).GetEnumerator()
    Dim newIntegerList As IEnumerable(Of SimpleString) = _
        (From i In stringList
         Let tmp = gen.MoveNext()
         Select New SimpleString With
                {
                    .Value = gen.Current()
                })
    

    此外,为了记录在案,使用方法语法(在这种情况下我更喜欢):

    Dim newIntegerList As IEnumerable(Of SimpleString) = _
        stringList.Select(Function(v, i) New SimpleString With
            {
                .Value = i + 1
            })