【问题标题】:Remove Nothing values from multidimensional arrays从多维数组中删除 Nothing 值
【发布时间】:2015-07-26 16:27:17
【问题描述】:

如何删除具有“无”的值并将数组减少为具有值的值?

假设我有一个名为 modvaluestmp(,) 的二维数组,我使用以下 linq 语句来删除任何内容。它有效,但结果数组(结果)是一维数组。有人可以帮我返回一个保留索引的二维数组吗?

Dim result() = (From str In modvaluestmp
              Where Not {Nothing}.Contains(str)).ToArray()

现有的数组是这样的

modvaluestmp(0,0) = "sometext1"
modvaluestmp(0,1) = "sometext2"
modvaluestmp(0,2) = "sometext3"
modvaluestmp(0,3) = "sometext4"
modvaluestmp(0,4) = Nothing
modvaluestmp(0,5) = Nothing
modvaluestmp(1,0) = "sometext5"
modvaluestmp(1,1) = "sometext6"
modvaluestmp(1,2) = "sometext7"
modvaluestmp(1,3) = "sometext8"
modvaluestmp(1,4) = Nothing
modvaluestmp(1,5) = Nothing

我希望数组如下

modvaluestmp(0,0) = "sometext1"
modvaluestmp(0,1) = "sometext2"
modvaluestmp(0,2) = "sometext3"
modvaluestmp(0,3) = "sometext4"
modvaluestmp(1,0) = "sometext5"
modvaluestmp(1,1) = "sometext6"
modvaluestmp(1,2) = "sometext7"
modvaluestmp(1,3) = "sometext8"

【问题讨论】:

  • 如何既保留索引消除一些值?请编辑您的问题,以提供原始数组的示例以及您希望得到的结果。
  • 该方法返回一维数组,尝试使用循环和if语句搜索Nothing的值
  • @AfnanMakhdoom 你能举个例子吗?
  • 您可能想要的是jagged array,而不是多维数组。 String()()
  • 不,实际上你需要一个锯齿状数组。

标签: arrays vb.net linq multidimensional-array


【解决方案1】:

您应该使用 而不是方形二维数组。所以你的代码应该是这样的:

 Dim modvaluestmp = New String(1)() {}

 modvaluestmp(0) = New String(5) {}
 modvaluestmp(1) = New String(5) {}

 modvaluestmp(0)(0) = "sometext1"
 modvaluestmp(0)(1) = "sometext2"
 modvaluestmp(0)(2) = "sometext3"
 modvaluestmp(0)(3) = "sometext4"
 modvaluestmp(0)(4) = Nothing
 modvaluestmp(0)(5) = Nothing
 modvaluestmp(1)(0) = "sometext5"
 modvaluestmp(1)(1) = "sometext6"
 modvaluestmp(1)(2) = "sometext7"
 modvaluestmp(1)(3) = "sometext8"
 modvaluestmp(1)(4) = Nothing
 modvaluestmp(1)(5) = Nothing

 Dim result = (From ary In modvaluestmp Select ary.Where(Function(str) Not str Is Nothing).ToArray()).ToArray()

帮助链接:

jagged arrays in Wikipedia

jagged arrays in MSDN

【讨论】:

    【解决方案2】:

    假设:

    1. 您的数组中只有尾随空元素
    2. 您希望截断所有行,使它们具有相同数量的 元素(可能丢失数据)
    3. 每一行至少有一个元素

    然后就可以判断哪一行最小,使用ReDim Preserve

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim modvaluestmp(,) As String = {
            {"sometext1", "sometext2", "sometext3", "sometext4", Nothing, Nothing},
            {"sometext5", "sometext6", "sometext7", "sometext8", Nothing, Nothing},
            {"sometext9", "sometext10", Nothing, Nothing, Nothing, Nothing}
        }
    
        Console.WriteLine(DisplayArray(modvaluestmp))
    
        Dim max As Integer = modvaluestmp.GetUpperBound(1)
        For y As Integer = 0 To modvaluestmp.GetUpperBound(0)
            For x As Integer = modvaluestmp.GetUpperBound(1) To 0 Step -1
                If Not IsNothing(modvaluestmp(y, x)) AndAlso x < max Then
                    max = x
                    Exit For
                End If
            Next
        Next
    
        ReDim Preserve modvaluestmp(modvaluestmp.GetUpperBound(0), max)
        Console.WriteLine(DisplayArray(modvaluestmp))
    End Sub
    
    Private Function DisplayArray(ByVal arr(,) As String) As String
        Dim sb As New System.Text.StringBuilder
        For y As Integer = 0 To arr.GetUpperBound(0)
            For x As Integer = 0 To arr.GetUpperBound(1)
                sb.Append(If(x = 0, "", ", ") & arr(y, x))
            Next
            sb.AppendLine("")
        Next
        Return sb.ToString
    End Function
    

    输出:

    sometext1, sometext2, sometext3, sometext4, , 
    sometext5, sometext6, sometext7, sometext8, , 
    sometext9, sometext10, , , , 
    
    sometext1, sometext2
    sometext5, sometext6
    sometext9, sometext10
    

    --------- 编辑 ----------

    这是使用List(Of List(Of String) 的示例:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim modvaluestmp(,) As String = {
            {"sometext1", "sometext2", "sometext3", "sometext4", Nothing, Nothing},
            {"sometext5", "sometext6", "sometext7", "sometext8", Nothing, Nothing},
            {"sometext9", "sometext10", Nothing, Nothing, Nothing, Nothing},
            {"sometext11", "sometext12", "sometext13", Nothing, Nothing, Nothing}
        }
    
        Dim stamps As New List(Of List(Of String))
        For y As Integer = 0 To modvaluestmp.GetUpperBound(0)
            Dim newRow As New List(Of String)
            For x As Integer = 0 To modvaluestmp.GetUpperBound(1)
                If Not IsNothing(modvaluestmp(y, x)) Then
                    newRow.Add(modvaluestmp(y, x))
                End If
            Next
            stamps.Add(newRow)
        Next
    
        For Each row As List(Of String) In stamps
            Console.WriteLine(String.Join(", ", row))
        Next
    
        ' Example of accessing an element directly:
        Console.WriteLine("stamps(0)(2) = " & stamps(0)(2))
    End Sub
    

    【讨论】:

    • 当然...但是如果所有行的元素数量不同,您将不得不截断元素或保留一些行中没有任何内容。如果您想要可变数量的元素,请使用锯齿状方法。
    • 不幸的是,元素的大小不会每次都相同。但无论如何感谢代码。会帮助我更进一步。 :) 是的,我会采用锯齿状数组
    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2011-04-05
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多