0

如果另一个数组中的相同元素是 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
4

2 回答 2

0

永远不要= 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

编辑 我的坏..我没有注意到添加到问题中的第二部分。另外,您可能会发现这很有趣VB.NET 中的 And 和 AndAlso 有什么区别?

于 2016-07-10T20:12:30.870 回答
0

解决方案:如果使用 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 = ""

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

于 2016-07-10T18:30:59.490 回答