【问题标题】:Check if string array contains non-empty strings without loop检查字符串数组是否包含不带循环的非空字符串
【发布时间】:2013-09-10 11:55:47
【问题描述】:

我有一个 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 实际上被评估为尝试的东西转换为 Long。

有没有更好的方法可以用来改造这个 If,这样我仍然可以在数组中只包含空字符串的测试,作为 If 的一部分,而不必添加前面的循环来测试BaySlots() 的每个索引是否为空字符串?

我认为除了循环之外可能应该有一些测试方法,因为这将是相对大量的工作来测试是否没有内容。

谢谢

PS 只是为了澄清这一点不是为了测试数组是否具有零维或等于 Nothing,而是它包含的字符串都等于 String.Empty。

【问题讨论】:

  • 如果数组中的所有元素都是Nothing,您希望它返回true,还是只希望它们都是非空字符串对象时返回true?
  • 我希望整个第一个条件:Not BaySlots.Contains(Not String.Empty)) 评估为真。它基本上是说“如果没有不为空的字符串”或同样的“如果 all 字符串为空”
  • 在这种情况下,看起来像黑子的第二个解决方案,使用All 将完全符合您的要求。

标签: arrays vb.net string


【解决方案1】:

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 中,如果字符串是 Nothing,则将字符串与 ""String.Empty 进行比较也会产生 True

【讨论】:

  • 谢谢!我一直试图摆脱双重否定,但我自己还没有管理它:) +1 用于接口方法的链接!
  • 请注意,您也可以使用If BaySlots.All(AddressOf String.IsNullOrEmpty) ...
  • 为什么不使用 .IndexOfAny(String.Empty).IndexOf(String.Empty) 我确定这些也会返回空索引的位置
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 2021-12-14
  • 2021-06-12
  • 2020-11-28
  • 1970-01-01
  • 2013-10-26
  • 2022-06-30
  • 2021-06-10
相关资源
最近更新 更多