代码之家  ›  专栏  ›  技术社区  ›  alwaysVBNET

对象数组上的lambda检查是否为空-argumentnullexception

  •  0
  • alwaysVBNET  · 技术社区  · 7 年前

    我想弄一系列的 BranchCode 从一系列 UserBranches() . 对于特定用户,列表为空,因此导致异常:

    System.ArgumentNullException:'值不能为空。
    参数名称:source'

    我正在使用 IIF 声明,但显然没有帮助:

    Dim sMatchedBranches = IIf(Not IsNothing(oUser.UserBranches),
                               oUser.UserBranches.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode)), "")
    

    我也用过 oUser.UserBranches.Any ,但仍然是同样的例外。有什么想法吗?

    **对于重复的建议,实际上并不是因为这个问题将IIF和空数组与lambda表达式结合在一起。

    1 回复  |  直到 7 年前
        1
  •  3
  •   rskar    7 年前

    首先,我要重申@tntinmn说过的话:试着戒掉microsoft.visualbasic。挑选有用的东西是可以的——在这种情况下,你要非常体贴和用心(例如,即使是C人也非常喜欢输入框!- What is the C# version of VB.net's InputDialog? )然而,vb现在有很多更好的方法来完成任务。

    叶老的主要缺点 IIf() 它只是一个函数,这意味着无论条件如何,每个参数都会被执行。这使得它几乎没有用处,即使在vb6/vba中也是如此,因为您无法避免任何运行时错误/异常,您知道这些错误/异常将根据条件发生。 If() 另一方面是一个实际的操作符,它提供了每个人都想要的东西——一种不必编写专门函数就可以仔细修剪表达式中执行的内容的方法。

    所以简单的答案就是 () 具有 小精灵 差不多就这样了:

    Dim sMatchedBranches = If(Not IsNothing(oUser.UserBranches),
                           oUser.UserBranches.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode)), "")
    

    人们可能会觉得这已经足够好了。但在vb中还有另外三个让事情变得更好的技巧。

    第一个是 ? 接线员。这样说很方便 If(oUser.UserBranches Is Nothing, Nothing, oUser.UserBranches.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode))) ,除了 ? 现在是这样的:

    oUser.UserBranches?.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode))
    

    第二个技巧是字符串插值,格式为 $"{myVar}" . 而不是 String.Format("{0} - BranchCode", z.BranchCode) ,现在可以是:

    $"{z.BranchCode} - BranchCode"
    

    第三个技巧是 小精灵 :如果给它两个参数,它将提供一种非常方便的处理方法 Nothing . If(x,y) 意思是如果 x 不是 没有什么 ,返回 X ,否则返回 y . ( 如果(x,y) 意思与 x ?? y 在c。)

    总而言之:

    Dim sMatchedBranches = If(oUser.UserBranches?.Select(Function(z) $"{z.BranchCode} - BranchCode"), "")