Arrays 不从多维数组中删除任何值
如何删除“无”值并将数组缩减为具有值的数组 假设我有一个名为Arrays 不从多维数组中删除任何值,arrays,vb.net,linq,multidimensional-array,jagged-array,Arrays,Vb.net,Linq,Multidimensional Array,Jagged Array,如何删除“无”值并将数组缩减为具有值的数组 假设我有一个名为modvaluestmp(,)的二维数组,我使用下面的linq语句不删除任何内容。它工作了,但结果数组(result)是一个一维数组。有人能帮我返回一个保存索引的2D数组吗 Dim result() = (From str In modvaluestmp Where Not {Nothing}.Contains(str)).ToArray() 现有的数组是这样的 modvaluestmp(0,0) = "s
modvaluestmp(,)
的二维数组,我使用下面的linq语句不删除任何内容。它工作了,但结果数组(result)是一个一维数组。有人能帮我返回一个保存索引的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"
您应该使用二维正方形阵列。因此,您的代码应该如下所示:
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()
帮助链接:
假设:
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
---------编辑----------
下面是一个使用List(of List(of String)
的示例:
如何既保留索引又消除某些值?请编辑您的问题,以给出原始数组的示例以及最终结果。该方法返回一维数组,尝试使用循环和if语句搜索Nothing@AfnanMakhdoom你能举个例子吗?你可能想要什么是一个数组,而不是多维数组。
String()()
不,实际上你需要一个锯齿状数组。当然……但是如果所有行的元素数量都不相同,你就必须截断元素或者保留一些行中没有任何元素。如果你想要一个可变数量的元素,那么就用锯齿状数组。很遗憾,元素不会每次都有相同的大小。不过谢谢你是的,我将接受锯齿阵列
sometext1, sometext2, sometext3, sometext4, ,
sometext5, sometext6, sometext7, sometext8, ,
sometext9, sometext10, , , ,
sometext1, sometext2
sometext5, sometext6
sometext9, sometext10
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