【问题标题】:Can't read values from array if the first position is empty如果第一个位置为空,则无法从数组中读取值
【发布时间】:2013-01-07 12:43:02
【问题描述】:

我有这个简单的代码,想法是从包含数字的数组中找到最小值,它在大多数情况下都有效:

For yy As Integer = 0 To 23
 If (IsNumeric(data(2, yy))) Then
  If (yy > 0) Then
   If (data(2, yy) < min(days)) Then
    min(days) = data(2, yy)
   End If
  Else
   min(days) = data(2, yy)
  End If
 End If
Next

现在,数据数组可能包含值,也可能不包含值,当数组中的第一个位置有值时,代码没有问题,即使数组中的其他位置为空。问题是当数组的第一个位置为空时,即使数组的其余部分充满了值,它也不会读取它们中的任何一个,有什么想法吗?

【问题讨论】:

    标签: arrays vb.net for-loop multidimensional-array minimum


    【解决方案1】:

    在您的场景中,在第一个循环中,您将 min(days) 设置为零。
    然后在随后的循环中(yy=1 等...),您检查 data(2, yy) 中包含的值是否与您在第一个循环中设置为零的 min(days) 相同。

    因此,除非 data(2,yy) 小于零,否则您永远不会得到 if(data(2,yy) &lt; min(days) 的真实条件

    您似乎有什么问题,因为您始终使用相同的值min(days)

    【讨论】:

    • 哦,你是对的,我真是太傻了,当 yy=1 时,它会自动比较 data(2,yy) 是否小于 min(days),永远不会因为 min(days) ) 默认值为 0。
    【解决方案2】:

    您可以事先检查以查找数组中的起始位置(注意未针对您的代码进行测试):

    Dim startAt As Integer = 0
    For i = 0 To 23
        If IsNumeric(data(2, i)) Then
            startAt = i
            min(days) = data(2, i)
            Exit For
        End If
    Next
    
    For i As Integer = startAt + 1 To 23
        If (IsNumeric(data(2, i))) Then
            If (data(2, i) < min(days)) Then
                min(days) = data(2, i)
            End If
        End If
    Next
    

    但是,我怀疑您需要为您的项目设置Option Strict On 并解决很多数据类型问题。

    【讨论】:

      【解决方案3】:

      如果第一个元素为空,那么您永远不会进入将min(days) 设置为初始值的Else 部分。因此min(days) 是默认值0。我假设0 总是小于days(2, yy) 中的每个数字。

      Linq 怎么做?

          min(days) = (From index1 In {2}
                       From index2 In Enumerable.Range(0, 24)
                       Where IsNumeric(data(index1, index2))
                       Select (data(index1, index2))).Min()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 2021-01-01
        • 2012-06-24
        • 1970-01-01
        • 2014-10-05
        • 2022-12-16
        • 1970-01-01
        相关资源
        最近更新 更多