【问题标题】:Zero element in an array of Object type evaluating to Nothing评估为 Nothing 的 Object 类型数组中的零元素
【发布时间】:2016-11-12 15:52:15
【问题描述】:

如果另一个数组中的相同元素是 Nothing,我会将数组的元素设置为 Nothing。 (由于各种原因,我无法克隆阵列)。两个数组都是对象类型。但是,当第一个数组 Objx(i, j) 中的元素等于 0 时,逻辑语句的计算结果为 Nothing 并将第二个数组的元素设置为 Nothing。为什么 Object 类型的数组中的零元素评估为 Nothing?

For i = 1 To NumRecords
  For j = 1 To NumFields
    If objx(i, j) = Nothing Then x(i, j) = Nothing
  Next
Next

此外,需要使用缺失数据代码来测试数组的元素是否缺失,因此如果缺失为真,则将其设置为 Nothing。

Dim MissingDataCode As Object = Nothing
For i = 1 To NumRecords
   For j = 1 To NumFields
      If objx(i, j) Is MissingDataCode Then x(i, j) = Nothing
      'If objx(i, j) = MissingDataCode Then x(i, j) = Nothing (does not work)
   Next
Next

现在,如果用户需要将缺失数据代码设置为 -9999,因此设置:

MissingDataCode = -9999

以下是否能够捕获 -9999 的值并将第二个数组设置为 Nothing?

If objx(i, j) = MissingDataCode Then x(i, j) = Nothing

或者代码行应该是

If objx(i, j) Is MissingDataCode Then x(i, j) = Nothing

【问题讨论】:

  • 数组类型有哪些?像整数这样的核心类型使用 Nothing 作为默认值 (0)。例如,Dim arryx(1, 1) As Int32 将创建一个所有元素为 0(默认值)的数组。
  • 打开 Option Strict On 并将比较更改为 If objx(i, j) Is Nothing Then x(i, j) = Nothing
  • 它们都是对象数组。
  • 解决了问题。
  • 恕我直言,用值表示缺失值是一个非常糟糕的主意;如果该值选择不当并存在于数组中怎么办?你应该用一个缺失值来表示一个缺失值,当你想表示缺失值时,应该使用设置为 Nothing 的可空整数,因为即使被视为对象数组,Is Nothing 测试也会按预期工作

标签: arrays vb.net missing-data nothing


【解决方案1】:

解决方案:如果使用 Object 类型的变量来捕获丢失数据代码的值,则需要使用两个 if 语句:

Dim MissDataCode As Object = Nothing

If objx(i, j) = MissDataCode And MissDataCode IsNot Nothing Then x(i, j) = Nothing
If objx(i, j) Is MissDataCode And MissDataCode Is Nothing Then x(i, j) = Nothing

这将防止 objx(i, j) 数组中的零被设置为空。但是,如果MissDataCode = 0,那么任何时候 objx(i, j) = 0,结果将评估为缺失并将第二个数组元素 x(i, j) 设置为 Nothing。

以上两行适用于任何情况,例如:

Dim MissDataCode As Object = Nothing
Dim MissDataCode As Object = -9999
Dim MissDataCode As Object = "NA"
Dim MissDataCode As Object = 0
Dim MissDataCode As Object = ""

请注意,有时输入零表示数据丢失。

【讨论】:

    【解决方案2】:

    切勿使用= Nothing 进行比较,而是使用Is Nothing。以下是几个例子:

    Dim o As Object
    Console.WriteLine(o = Nothing)  ' True
    Console.WriteLine(o Is Nothing) ' True
    
    o = 0
    Console.WriteLine(o = Nothing)  ' True
    Console.WriteLine(o Is Nothing) ' False
    
    o = ""
    Console.WriteLine(o = Nothing)  ' True
    Console.WriteLine(o Is Nothing) ' False
    

    编辑 我的坏..我没有注意到添加到问题中的第二部分。 另外,您可能会发现这个有趣的What is the difference between And and AndAlso in VB.NET?

    【讨论】:

    • 如果你有 Option Strict On ;禁止使用= NothingObject 变量;但如果我们理解它的真正含义,= Nothing 对于给定类型是没有问题的
    • 这是真的,但是,问题涉及使用MissDataCode,当它为真时,将另一个数组设置为Nothing。在下面提供的解决方案中,如果objx(i, j)=-9998,则该值是有效的并且不是缺失的数字。但是,如果用户在数据中放置 -9999 以表示缺失,则 objx(i, j) = -9999MissDataCode = -9999 的使用将评估为真。在上面的代码中,没有办法确定 -9998 不是缺失值。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多