0

For Eachループを使用した場合の文字列配列の動作を知りたいです。次のコードを検討してください。

Dim StringArray(499) As String
'fill in each element with random string

Dim count As Int32
Dim current As String

For Each current in StringArray
    'do something with current
    count = count + 1
    If count = 10
        Exit For
    End If
Next

're-enter the StringArray again
count = 0
For Each current in StringArray
    'do something with current
    count = count + 1
    If count = 10
        Exit For
    End If
Next

上記のコードに示されているように、For Each ループを使用して StringArray に 2 回アクセスする必要がある場合、各For Each ループで 10 個の要素しか使用していないにもかかわらず、StringArrayのすべての要素が 2 回読み込まれるというのは本当ですか? パフォーマンスの観点から、String 配列をデータ構造として使用して、メソッド内で 20 回など、複数回アクセスする必要がある文字列のリストを格納することをお勧めしますか?

4

1 に答える 1

5

「ロードされた」とはどういう意味ですか?配列を反復処理しているだけです。それは何も「ロード」しません - それを繰り返すだけです。それがあなたが心配していたものなら、それはコピーを作成しません。

少なくとも C# では、foreachコンパイル時に配列であることがわかっている式のループは、基本的にインデックスを保持 (およびインクリメント) し、直接配列アクセスを使用します。を作成することすらありませんIEnumerator(Of T)。VBも同じように動作すると思います。

ただし、LINQ を使用するとサンプル コードをより簡単にできることに注意してください。

' No need to declare any variables outside the loop
For Each current As String in StringArray.Take(10)
    ' Do something with current
Next

パフォーマンスの観点から、String 配列をデータ構造として使用して、メソッド内で 20 回など、複数回アクセスする必要がある文字列のリストを格納することをお勧めしますか?

何に対して?たとえば、そのたびにデータベースを再クエリするよりも、その方がよいでしょう。しかし、 a を文字列配列に変換する価値はありませんList(Of String)...

于 2012-04-27T09:06:41.540 に答える