我正在尝试从UserBranches()
数组中获取BranchCode
字符串。对于特定用户,该列表为nothing,因此会导致异常:
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表达式的空数组结合在一起。
发布于 2018-06-03 01:00:53
首先,我要重申@TnTinMn说过的话:试着摆脱对Microsoft.VisualBasic的依赖。挑选任何有用的东西都是可以的--在这种情况下,要非常周到和有意(例如,即使是C#的人也很喜欢InputBox!- What is the C# version of VB.net's InputDialog?)。然而,今天的VB有很多更好、更好的方法来完成任务。
ye olde IIf()
的主要缺陷是它只是一个函数,这意味着无论条件如何,每个参数都会被执行。这使得它几乎没有什么用处,即使在VB6/VBA中也是如此,因为你无法避免任何运行时错误/异常,因为你知道每个条件都会发生。另一方面,If()
是一个实际的运算符,它提供了每个人都想要的东西-一种在表达式中仔细修剪执行内容的方法,而不必编写专门的函数。
因此,简单的答案就是用If()
替换IIf()
并完成大部分工作:
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"
第三个技巧是关于If()
的:如果给它两个参数,它将提供一种处理Nothing
的非常方便的方法。If(x,y)
表示如果x
不是Nothing
,则返回x
,否则返回y
。(If(x,y)
的含义与C#中的x ?? y
相同。)
把所有这些放在一起:
Dim sMatchedBranches = If(oUser.UserBranches?.Select(Function(z) $"{z.BranchCode} - BranchCode"), "")
https://stackoverflow.com/questions/50658370
复制相似问题