2

counterLINQ クエリ内でインクリメントするにはどうすればよいですか?

次のことを考慮してください

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) なし (アプリケーションのどこでも Lists を使用していないため、一貫性を保つために開始したくありません。また、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's correct answerに加えて、列挙子を使用してLet-clauseで副作用を生成できます。

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 に答える