6

コレクションが何もない場合、for each ループを処理するにはどうすればよいですか?

foreach ループを if でラップして、何もチェックしないようにし、それが何もない場合にのみ for each ループに入る必要がありますか?

For Each item As String In MyStringList 

    'do something with each item but something myStringList will be nothing?


Next
4

5 に答える 5

10

foreach ループを if でラップして、何もチェックしないようにし、それが何もない場合にのみ for each ループに入る必要がありますか?

はい。

If MyStringList IsNot Nothing Then
    For Each item As String In MyStringList 
       'do something ...
    Next
End If

Microsoftによると、これは仕様によるものです。

ほとんどの foreach ループは、null 以外のコレクションを反復する目的で記述されていると思います。null を反復しようとすると、コードを修正できるように例外が発生するはずです。Foreach は基本的に構文上の利便性です。そのため、「魔法のような」ものであってはならず、内部で予期しないことを行うべきではありません。null ではなく空のコレクションの使用を提案した投稿に同意します。(通常、シングルトン手法を使用してかなり再利用できます)。

于 2012-07-18T17:30:11.187 に答える
3

を追加することIf collection IsNot Nothing Thenはそれほど面倒ではありませんが、この構造がたくさんある場合は、この Extension メソッドが望ましい場合があります。

    '''---------------------------------------------------------------------
    ''' Extension Function: OrEmpty
    ''' 
    ''' <summary>
    '''   Returns an empty enumeration if the source is Nothing.
    ''' </summary>
    ''' 
    ''' <typeparam name="T">The type to create an enumeration of. Normally inferred.</typeparam>
    ''' 
    ''' <param name="Source">The source enumeration.</param>
    ''' 
    ''' <returns>The source enumeration unless it is Nothing; then an empty enumeration.</returns>
    ''' 
    ''' <remarks>
    ''' </remarks>
    ''' 
    ''' <revisionhistory>
    '''   100930 MEH Created.
    ''' </revisionhistory>
    '''---------------------------------------------------------------------
    <Extension()> _
    Function OrEmpty(Of T)(ByVal Source As IEnumerable(Of T)) As IEnumerable(Of T)
        If Source IsNot Nothing Then _
            Return Source
        Return Enumerable.Empty(Of T)()
    End Function

タイプを指定するOption Infer On必要がないため、使用例は次のとおりです。

For Each item As String In MyStringList.OrEmpty 

    'do something with each item but something myStringList will be nothing?

Next
于 2012-07-20T05:45:55.400 に答える
2

foreach ループを if でラップして、何もチェックしないようにし、それが何もない場合にのみ for each ループに入る必要がありますか?

ええ、それはあなたがしなければならないことです。または、文字列リストを返す関数 (制御できる場合) が null 配列を返さず、代わりに空のコレクションを返すようにします。これは、コレクションを返す関数の標準的なアプローチです。 LINQ は友好的ではなく、どこにでも if を書く必要があります。

于 2012-07-18T17:30:39.523 に答える
1
If Not IsNothing(collection)
' For Each goes here
End If
于 2012-07-18T18:21:52.590 に答える