【问题标题】:VB.net How to access row in 2 dimensional array?VB.net 如何访问二维数组中的行?
【发布时间】:2020-12-29 14:21:26
【问题描述】:

我想从 VB.NET 中的二维数组中读取第一行的所有元素。有没有一种简单的方法来做到这一点,而不是运行一个循环。我知道在 MATLAB 中有可能说:A(1,:) 并且它完成了。 谢谢。

【问题讨论】:

    标签: arrays vb.net multidimensional-array


    【解决方案1】:

    数组本身没有任何内容可以在没有循环的情况下读取,但您可以使用 LINQ 查询,例如

    Dim firstRow = Enumerable.Range(0, myArray.GetUpperBound(1) + 1).
                              Select(Function(i) myArray(0, i))
    

    请注意,没有为二维数组定义什么是“行”和什么是“列”,因此您是否要使用它或这个完全取决于您:

    Dim firstRow = Enumerable.Range(0, myArray.GetUpperBound(0) + 1).
                              Select(Function(i) myArray(i, 0))
    

    这为您提供了指定元素的可枚举列表,所以问题是,您想用它做什么?你实际上没有指定。事实上,你真正能做的就是枚举它,这意味着在它上面运行一个For Each 循环。这有点违背了首先避免循环的目的。如果您说但实际上没有说您想要一维数组中的这些元素,那么您可以调用ToArray

    Dim firstRow = Enumerable.Range(0, myArray.GetUpperBound(1) + 1).
                              Select(Function(i) myArray(0, i)).
                              ToArray()
    

    编辑:

    这是一个可以用来完成这项工作的扩展方法:

    Imports System.Runtime.CompilerServices
    
    Public Module ArrayExtensions
    
        <Extension>
        Public Function GetRow(Of T)(source As T(,), rowIndex As Integer) As T()
            Return Enumerable.Range(0, source.GetUpperBound(1) + 1).
                              Select(Function(i) source(rowIndex, i)).
                              ToArray()
        End Function
    
    End Module
    

    然后它使调用代码更加简洁,特别是如果您需要多次执行此操作,例如

    Dim firstRow = myArray.GetRow(0)
    

    【讨论】:

    • @IrtazaWaheed,我用扩展方法增强了答案。
    • "两者有什么区别" 第一种方法假设第一个索引是行,myArray(0, i),第二个索引是列。第二种方法假设第一个索引是列,第二个索引是行:myArray(i, 0)。请注意0i 在两个版本中已交换,GetUpperBound() 调用使用10 分别获取列数或行数。
    • “您能否进一步解释您提到的前两种方法以及两者之间的区别”。如果您阅读代码,那么您可以看到代码中的差异。如果您执行代码,那么您可以看到行为的差异。其中一个获得“行”,其中一个获得“列”。哪一个取决于你的定义。
    • “这种方法是否也适用于锯齿状数组”。你为什么需要它?锯齿状数组是一维数组的一维数组,所以我认为大多数人会认为锯齿状数组的第一“行”是第一个内部数组,所以这只是外部数组的第一个元素:Dim firstRow = myJaggedArray(0) .如果您真正想要的是一个包含每个内部数组的第一个元素的数组,那么您基本上可以使用与第二个 sn-p 相同的代码,将 myArray(i, 0) 替换为 myArray(i)(0)。如果需要,您可以在最后链接ToArray 调用。
    • 如果从交错数组开始,因为它实际上是一维数组,可以将myArray.GetUpperBound(0) + 1简化为myArray.Length
    【解决方案2】:

    如果您不知道数组的大小,您可以像这样使用嵌套循环 For Each:

    For each row in array
        For each col in row
        ''something here like Debug.Write(col.ToString)
        Next
    Next
    

    如果您知道自己的大小并且想要数组中的特定项目,您只需像在任何其他循环“for”中一样执行此操作,如下所示:

    For index As Integer = 5 To 5
        For index2 As Integer = 3 To 3
            Debug.Write(index2.ToString)
        Next
    Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多