从多维数组中移除空值

4

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

假设我有一个名为modvaluestmp(,)的二维数组,我使用了以下 linq 语句来消除无用。它奏效了,但结果数组(结果)是单个维度的数组。有人可以帮助我返回保留索引的2D数组吗?

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"

2
你如何既保留索引又排除某些值?请编辑你的问题,提供一个原始数组的示例以及你想要得到的结果。 - Blackwood
1
该方法返回单维数组,请尝试使用循环和if语句来查找Nothing的值。 - Afnan Makhdoom
@AfnanMakhdoom,你能给一个例子吗? - Mani kv
2
你可能想要的是一个“锯齿状数组”(jagged array),而不是多维数组。String()() - Bjørn-Roger Kringsjå
3
不,实际上你需要一个锯齿数组。 - Hans Passant
显示剩余6条评论
2个回答

1
假设:
  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

当然可以...但是如果所有行的元素数量不相同,你要么必须截断元素,要么保留一些带有空值的行。如果你想要一个可变数量的元素,那就采用嵌套数组的方法。 - Idle_Mind
很遗憾,这些元素的大小每次都不相同。但无论如何感谢您提供的代码。这会在未来对我有所帮助。:) 是的,我会采用jagged数组。 - Mani kv

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()

帮助链接:

维基百科中的交错数组

MSDN 中的交错数组


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接