Asp.net 数组循环顺序问题

Asp.net 数组循环顺序问题,asp.net,arrays,arraylist,associative-array,stringbuilder,Asp.net,Arrays,Arraylist,Associative Array,Stringbuilder,嘿,我正在尝试以正确的格式将我的数组放入ASP.net网页中,用于订单的表格 命令应为: model_number comm_category service freight sales_tax sales unit_price price id_price 目前它的输出方式如下: model_number price unit_price id_price sales_tax sales service freight comm_category 因此,我无法使用此处的代码按正确顺序追加到

嘿,我正在尝试以正确的格式将我的数组放入ASP.net网页中,用于订单的表格

命令应为:

model_number
comm_category
service
freight
sales_tax
sales
unit_price
price
id_price
目前它的输出方式如下:

model_number
price
unit_price
id_price
sales_tax
sales
service
freight
comm_category
因此,我无法使用此处的代码按正确顺序追加到字符串:

Public Sub AssocArray_To_String(ByRef Output As System.Text.StringBuilder, ByVal AssocArrayInput As AssocArray)
    For iParent As Integer = 0 To AssocArrayInput.Count - 1
        Dim intX As Integer = 0
        Dim arrParent As AssocArray = TryCast(AssocArrayInput.Item(iParent), AssocArray)
        If arrParent Is Nothing Then Continue For

        For iChild As Integer = 0 To arrParent.Count - 1
            Call buildItems(PHPConvert.ToString(arrParent.Keys(iChild)), PHPConvert.ToString(arrParent.Values(iChild)), intX)
            intX += 1
        Next iChild
    Next iParent
End Sub

Private Sub buildItems(ByVal nameOfItem As String, ByVal itemItself As String, ByVal intX As Integer)
    Dim tmpStuff As Decimal = 0.0
    Dim qty As Integer = 1
    Dim model_number As String = ""
    Dim comm_category As String = ""
    Dim service As Double = 0
    Dim freight As Double = 0
    Dim sales_tax As Double = 0
    Dim sales As Double = 0
    Dim unit_price As Double = 0
    Dim price As Double = 0
    Dim id_price As Double = 0

    If nameOfItem = "model_number" Then
        model_number = itemItself
        tableLoop += "<tr><td bgcolor=""#CCCCCC""><asp:Label ID=""item_count_" & intX & """ Text=""Label"">" & qty & "</asp:Label></td>"
        tableLoop += "<td bgcolor=""#CCCCCC""><asp:Label ID=""model_number_" & intX & """ Text=""Label"">" & model_number & "</asp:Label></td>"
    ElseIf nameOfItem = "comm_category" Then
        comm_category = itemItself
        tableLoop += "<td bgcolor=""#CCCCCC""><asp:Label ID=""comm_category_" & intX & """ Text=""Label"">" & comm_category & "</asp:Label></td>"
    ElseIf nameOfItem = "service" Then
        service = Format(Convert.ToDouble(itemItself), "$######.00")
        tableLoop += "<td bgcolor=""#CCCCCC""><asp:Label ID=""service_" & intX & """ Text=""Label"">" & service & "</asp:Label></td>"
    ElseIf nameOfItem = "freight" Then
        freight = Format(Convert.ToDouble(itemItself), "$######.00")
        tableLoop += "<td><asp:Label ID=""freight_" & intX & """ Text=""Label"">" & freight & "</asp:Label></td>"
    ElseIf nameOfItem = "sales_tax" Then
        sales_tax = Format(Convert.ToDouble(itemItself), "$######.00")
        tableLoop += "<td><asp:Label ID=""sales_tax_" & intX & """ Text=""Label"">" & sales_tax & "</asp:Label></td>"
    ElseIf nameOfItem = "sales" Then
        sales = Format(Convert.ToDouble(itemItself), "$######.00")
        tableLoop += "<td bgcolor=""#CCCCCC""><asp:Label ID=""sales_" & intX & """ Text=""Label"">" & sales & "</asp:Label></td>"
    ElseIf nameOfItem = "unit_price" Then
        unit_price = Format(Convert.ToDouble(itemItself), "$######.00")
        tableLoop += "<td bgcolor=""#CCCCCC""><asp:Label ID=""unit_price_" & intX & """ Text=""Label"">" & unit_price & "</asp:Label></td></tr>"
    ElseIf nameOfItem = "price" Then
        price = Format(Convert.ToDouble(itemItself), "$######.00")
        tableLoop += "<td><asp:Label ID=""amount_" & intX & """ Text=""Label"">" & price & "</asp:Label></td>"
    ElseIf nameOfItem = "id_price" Then
        id_price = Format(Convert.ToDouble(itemItself), "$######.00")
        tableLoop += "<td><asp:Label ID=""id_price_" & intX & """ Text=""Label"">" & id_price & "</asp:Label></td>"
    End If
End Sub
Public Sub-AssocArray_To_String(ByRef输出为System.Text.StringBuilder,ByVal-assocararray输入为AssocArray)
对于iParent As Integer=0,将其设置为AsscararyInput.Count-1
Dim intX为整数=0
Dim arrParent As ASCOCARRAY=TryCast(ASCOCARRAYINPUT.Item(iParent),ASCOCARRAY)
如果arrParent为空,则继续
对于iChild As Integer=0,则为arrpent.Count-1
调用buildItems(PHPConvert.ToString(arrpparent.Keys(iChild)),PHPConvert.ToString(arrpparent.Values(iChild)),intX)
intX+=1
下一个
下一个iPart
端接头
私有子构建项(ByVal nameOfItem作为字符串,ByVal Item本身作为字符串,ByVal intX作为整数)
尺寸tmpStuff为十进制=0.0
将数量调整为整数=1
尺寸型号_编号为String=“”
Dim comm_类别为String=“”
双精度服务=0
双精度运费=0
将销货税调整为双倍=0
将销售额降低为Double=0
双精度单价=0
双精度价格=0
Dim id_价格为双精度=0
如果nameOfItem=“型号编号”,则
型号=项目本身
tableLoop+=“”&qty&“”
tableLoop+=“”&型号&“”
ElseIf nameOfItem=“comm_category”则
comm_category=项目本身
tableLoop+=“”&comm_类别&“
ElseIf nameOfItem=“服务”则
服务=格式(Convert.ToDouble(项目本身),“$######.00”)
tableLoop+=“”&服务&“”
ElseIf nameOfItem=“运费”则
运费=格式(Convert.ToDouble(项目本身),“$######.00”)
tableLoop+=“”&运费&“”
ElseIf nameOfItem=“销售税”则
销售税=格式(将.ToDouble(项目本身)转换为“$######.00”)
tableLoop+=“”&销售税&“”
ElseIf nameOfItem=“sales”则
sales=格式(Convert.ToDouble(项目本身),“$######.00”)
tableLoop+=“”&sales&“”
ElseIf nameOfItem=“单价”则
单价=格式(将.ToDouble(项目本身)转换为“$”
tableLoop+=“”&单价&“”
ElseIf nameOfItem=“price”则
price=格式(Convert.ToDouble(项目本身),“$######.00”)
tableLoop+=“”&price&“”
否则nameOfItem=“id\u price”则
id#u price=格式(Convert.ToDouble(项目本身),“$####.00”)
tableLoop+=“”&id\u价格&“
如果结束
端接头
最终结果如下:

<tr><td bgcolor="#CCCCCC"><asp:Label ID="item_count_0" Text="Label">1</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="model_number_0" Text="Label">TTN491-7BW</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="sales_1" Text="Label">3084.63</asp:Label></td>
<td><asp:Label ID="amount_2" Text="Label">3810</asp:Label></td>
<td><asp:Label ID="sales_tax_3" Text="Label">290.37</asp:Label></td>
<td><asp:Label ID="id_price_4" Text="Label">3810</asp:Label></td></tr>
<td bgcolor="#CCCCCC"><asp:Label ID="comm_category_5" Text="Label">X24</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="service_6" Text="Label">51</asp:Label></td>
<td><asp:Label ID="freight_7" Text="Label">384</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="unit_price_8" Text="Label">3135.63</asp:Label></td></tr>
1
TTN491-7BW
3084.63
3810
290.37
3810
X24
51
384
3135.63
哪个输出应该是这样的:

<tr><td bgcolor="#CCCCCC"><asp:Label ID="item_count_0" Text="Label">1</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="model_number_0" Text="Label">TTN491-7BW</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="comm_category_5" Text="Label">X24</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="service_6" Text="Label">51</asp:Label></td>
<td><asp:Label ID="freight_7" Text="Label">384</asp:Label></td>
<td><asp:Label ID="sales_tax_3" Text="Label">290.37</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="sales_1" Text="Label">3084.63</asp:Label></td>
<td bgcolor="#CCCCCC"><asp:Label ID="unit_price_8" Text="Label">3135.63</asp:Label></td></tr>
<td><asp:Label ID="amount_2" Text="Label">3810</asp:Label></td>
<td><asp:Label ID="id_price_4" Text="Label">3810</asp:Label></td></tr>
1
TTN491-7BW
X24
51
384
290.37
3084.63
3135.63
3810
3810

如何将数组按正确的顺序排列?

为什么不直接引用所需的项,而不是通过关联键(按任意顺序返回)进行循环:

或者更好的方法是,完全去掉
BuildItems
,将逻辑内联到上面适当的位置。

您正在调用

For iChild As Integer = 0 To arrParent.Count - 1
        Call buildItems(PHPConvert.ToString(arrParent.Keys(iChild)), 
                        PHPConvert.ToString(arrParent.Values(iChild)),  
                        intX)
        intX += 1
Next iChild
因此,您将始终获得arrParent中项目的顺序。因此,您所要做的就是以正确的顺序手动调用buildItems(…)

Call buildItems(PHPConvert.ToString("model_number"), 
                PHPConvert.ToString(arrParent.Values("model_number")),  
                        intX)
Call buildItems(PHPConvert.ToString("comm_category"), 
                PHPConvert.ToString(arrParent.Values("comm_category")),  
                        intX)

' and so on

此外,我在buildItems中找不到
tableLoop
的定义。这似乎是一个简单的字符串变量。您应该使用StringBuilder,因为此类连接字符串的速度要快得多!请参阅。

这对数组循环了几次(列表中可能有4个不同的项目),因此我认为它仍然可以工作?是所有的键都存在于所有数组行中,还是有些项目没有所有的键,例如
运费
不适用于某些条目?如果是这样的话,这里可能需要做更多的工作。它们都是一样的-每个数组只能有一个以上的项。如型号等。。然后启动阵列1型号\u编号等。。然后是数组2 model_number等。我得到了从字符串“model_number”转换为类型“integer”的错误信息。什么是
AssocArray
?什么是PHPConvert?我不认识这些类型,所以我猜测了一些事情,比如能够调用
arrParent.Values(“string”)
来按名称而不是索引查找属性。因为我没有您的代码环境和引用的库,所以您必须了解这一部分。我刚刚为您提供了一个粗略的方法/算法来解决您的问题,而不是100%的最终测试即用代码。我发现从字符串“model_number”转换为类型“integer”的错误无效?什么类型是AsCararay?找不到任何定义。抱歉,我假设可以通过名称访问此数组中的项目!如果您知道任何属性的索引号,您可以替换它。e、 g如果“comm_category”的索引号为1,则只需将代码更新为arrParent.Values(1),如果数组中有多个项,则无法使用arrParent.Values(0)、arrParent.Values(1)等。。。它只是在达到值(10)后不断重复相同的值
Call buildItems(PHPConvert.ToString("model_number"), 
                PHPConvert.ToString(arrParent.Values("model_number")),  
                        intX)
Call buildItems(PHPConvert.ToString("comm_category"), 
                PHPConvert.ToString(arrParent.Values("comm_category")),  
                        intX)

' and so on