我有一个If语句来检查很多东西(BaySlots()是一个字符串数组)。
If (Not BaySlots.Contains(Not String.Empty)) OrElse
(Not BayAcId = 0 AndAlso Not BayAcId = acProgramId _
AndAlso overrideSetting = False) Then
我虽然第一个条件的Array.Contains
方法足以告诉我数组是否只保留空字符串,但是它给出了InvalidCastException: Conversion from string "" to type Long is not valid
所以我猜测Not String.Empty
实际上是{{1}}评估为试图转换为Long的东西。
有没有更好的方法可以用来改装这个if,这样我仍然可以在数组中只包含空字符串的测试,作为If的一部分,而不是必须添加一个前面的循环来测试BaySlots()的每个索引是否为空字符串?
我认为应该有一些方法可以测试除了循环以外的其他方法,因为如果没有内容,只需要测试相对较多的工作。
由于
PS只是为了澄清这不是为了测试数组是否具有零维度或等于Nothing,而是它包含的字符串都等于String.Empty。
答案 0 :(得分:4)
LINQ的Enumerable.Any
可以做到这一点。您Not Contains(Not String.Empty))
的直接翻译将是:
If (Not BaySlots.Any(Function(x) x <> "")) OrElse ...
(如果您愿意,可以随""
替换String.Empty
。)
由于您在这里有双重否定,我建议将其替换为Enumerable.All
以便于阅读:
If BaySlots.All(Function(x) x = "") OrElse ...
这也更清楚地传达了你的意图(“如果所有条目都是空的......”)。
注意:在VB.NET中,如果字符串为""
,则将字符串与String.Empty
或True
进行比较也会产生Nothing
。