每个循环都没有集合 - 如何处理它?

时间:2012-07-18 17:28:25

标签: vb.net

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

我是否需要将foreach循环包装在if中以检查什么,只有当它不是什么时候才进入每个循环?

For Each item As String In MyStringList 

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


Next

5 个答案:

答案 0 :(得分:9)

  

我是否需要将foreach循环包装在if中以检查什么,只有当它不是什么时候才进入每个循环?

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

Microsoft说这是设计的:

  

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

答案 1 :(得分:2)

  

我是否需要将foreach循环包装在if中以检查是否有任何内容   只有它不是什么都没有,然后输入每个循环?

是的,那就是你要做的。或者确保返回字符串列表的函数(如果你对它有控制权)永远不会返回一个空数组,而是一个空集合,而不是返回集合的函数的标准方法 - 它们永远不应该为null,因为它使它们成为LINQ不友好,迫使你到处写ifs.

答案 2 :(得分:1)

If Not IsNothing(collection)
' For Each goes here
End If

答案 3 :(得分:1)

添加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

答案 4 :(得分:0)

另一种替代方法是使用if(arg1, arg2)运算符。

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

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