当集合什么都没有时,我如何为每个循环处理一个,我认为它会跳过但我得到一个例外?
我是否需要将foreach循环包装在if中以检查什么,只有当它不是什么时候才进入每个循环?
For Each item As String In MyStringList
'do something with each item but something myStringList will be nothing?
Next
答案 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)
是的,那就是你要做的。或者确保返回字符串列表的函数(如果你对它有控制权)永远不会返回一个空数组,而是一个空集合,而不是返回集合的函数的标准方法 - 它们永远不应该为null,因为它使它们成为LINQ不友好,迫使你到处写ifs.我是否需要将foreach循环包装在if中以检查是否有任何内容 只有它不是什么都没有,然后输入每个循环?
答案 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运算符将返回第二个参数,即空列表。