6

当集合什么都不是时,我如何处理每个循环,我认为它会跳过但我得到一个例外?

我是否需要将 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

微软说这是设计使然:

我认为大多数 foreach 循环都是为了迭代非空集合而编写的。如果您尝试通过 null 进行迭代,您应该得到您的异常,以便您可以修复您的代码。Foreach 基本上是一种语法便利。因此,它不应该是“神奇的”并且在引擎盖下做意想不到的事情。我同意建议使用空集合而不是 null 的帖子。(它们通常可以使用单例技术大量重复使用)。

于 2012-07-18T17:30:11.187 回答
3

添加If collection IsNot Nothing Then并不是那么繁重,但是如果您确实有很多这种构造,则此扩展方法可能更可取:

    '''---------------------------------------------------------------------
    ''' 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 循环?

是的,这就是你必须做的。或者确保返回字符串列表的函数(如果你可以控制它)永远不会返回一个空数组而是一个空集合,顺便说一句,这是返回集合的函数的标准方法——它们永远不应该为空,因为它使它们LINQ 不友好,并迫使你到处写 ifs。

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

另一种选择是使用 if(arg1, arg2)运算符。

For Each item As String In If(MyStringList, New List(Of String)())
    'do something .....
Next

if 运算符将返回第二个参数,即空列表,如果第一个参数为空

于 2019-08-13T14:57:32.080 回答