2

如何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) (我不在我的应用程序中的任何地方使用列表,我宁愿不开始一致性。此外 IEnumerable 意味着查询在必要时才会执行)
  • 没有循环(我没有使用具体的类。还有一致性,因为我尽量减少使用循环并主要使用 LINQ)
4

2 回答 2

1

因为 VB.NET 中的赋值和等号运算符完全相同,所以不能在 VB.NET 中等效于:

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

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

但是,您可以编写辅助方法,它接受一个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
        })

但不得不说,我真的一点都不懂你们的规矩……

于 2013-04-15T06:08:23.060 回答
0

只是为了好玩,除了Marcin 的正确答案之外,您还可以使用枚举器并使用 - 子句产生副作用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
        })
于 2013-04-15T06:21:02.463 回答