2015-04-23 139 views
1

我有一个包含47个字段的结构。我也有一个字符串包含“|”划定的价值。我想用字符串中的值填充结构。我能想到的唯一解决方案如下。然而,这涉及到硬编码。有没有更好的方式通过循环或其他任何填充结构

Dim lobjStructData As New SUB_PNDGORDR_QRY_RESP 
     Dim lstrarrStream As String() = pstrStream.Split(CChar("|")) 

     lobjStructData.ClientId = CType(lstrarrStream(0), Char()) 
     lobjStructData.PortfolioId = CShort(lstrarrStream(1)) 
     lobjStructData.Currency = CType(lstrarrStream(2), Char()) 
     lobjStructData.ProductId = CType(lstrarrStream(3), Char()) 
     lobjStructData.InstrumentClass = CShort(lstrarrStream(4)) 
     lobjStructData.OrderSymbol = CType(lstrarrStream(5), Char()) 
     lobjStructData.Qty = CDbl(lstrarrStream(6)) 
     lobjStructData.QtyRemaining = CDbl(lstrarrStream(7)) 
     lobjStructData.OrderPrice = CDbl(lstrarrStream(8)) 
     lobjStructData.TriggerPrice = CDbl(lstrarrStream(9)) 
     lobjStructData.Remarks = CType(lstrarrStream(10), Char()) 
     lobjStructData.QtyDiscRem = CDbl(lstrarrStream(11)) 
     lobjStructData.OrderDateTime = CInt(lstrarrStream(12)) 
     lobjStructData.IntOrderNo = CDbl(lstrarrStream(13)) 
     lobjStructData.OrderStat = CType(lstrarrStream(14), Char()) 
     lobjStructData.DiscQty = CDbl(lstrarrStream(15)) 
     lobjStructData.SerialNo = CInt(lstrarrStream(16)) 
     lobjStructData.OpenCloseFlg = CInt(lstrarrStream(17)) 
     lobjStructData.InstrumentId = CInt(lstrarrStream(18)) 
     lobjStructData.ContractSeriesId = CInt(lstrarrStream(19)) 
     lobjStructData.InstrumentType = CShort(lstrarrStream(20)) 
     lobjStructData.BuySellInd = CShort(lstrarrStream(21)) 
     lobjStructData.MinFillQty = CDbl(lstrarrStream(22)) 
     lobjStructData.ExchId = CInt(lstrarrStream(23)) 
     lobjStructData.OrderTyp = CShort(lstrarrStream(24)) 
     lobjStructData.ValidityCond = CDbl(lstrarrStream(25)) 
     lobjStructData.ExchTrdNo = CType(lstrarrStream(26), Char()) 
     lobjStructData.IntTranscode = CShort(lstrarrStream(27)) 
     lobjStructData.ValidityAttr = CInt(lstrarrStream(28)) 
     lobjStructData.BosRefId = CInt(lstrarrStream(29)) 
     lobjStructData.OriginatorId = CType(lstrarrStream(30), Char()) 
     lobjStructData.Commision = CDbl(lstrarrStream(31)) 
     lobjStructData.SolicitedFlg = CType(lstrarrStream(32), Char()) 
     lobjStructData.OrderFamily = CType(lstrarrStream(33), Char()) 
     lobjStructData.ReceiptTime = CInt(lstrarrStream(34)) 
     lobjStructData.ExchShortSellFlag = CType(lstrarrStream(35), Char()) 
     lobjStructData.cSourceFlag = CChar(lstrarrStream(36)) 
     lobjStructData.extnno = CInt(lstrarrStream(37)) 
     lobjStructData.sReceiptMode = CType(lstrarrStream(38), Char()) 
     lobjStructData.sErrorMsg = CType(lstrarrStream(39), Char()) 
     lobjStructData.cCoverUncover = CChar(lstrarrStream(40)) 
     lobjStructData.fATOrderNo = CDbl(lstrarrStream(41)) 
     lobjStructData.iQtyCond = CShort(lstrarrStream(42)) 
     lobjStructData.iReserve2 = CChar(lstrarrStream(43)) 
     lobjStructData.fInternalRefId = CDbl(lstrarrStream(44)) 
+1

没有,有没有其他的方法,因为你的逻辑是硬编码字符串中的'字符串(索引)'与特定属性。 –

+0

基本上我有一个带有“|”的文本文件分隔的值。此文本文件中的每行都与上面提到的结构同步。 我需要一次一个地填充文本文件中的条目。是否有其他方式可以避免硬编码和冗余? – user3458716

+0

文本文件是否有标题行?一般来说,不,没有其他办法。我不会建议一种反射方法(如果将它的名称存储在“Dictionary(Of String,Int32)”中,这可能有助于找到属性,但这是一种非常容易出错且难看的方法)。 –

回答

0

好来达到同样的,你有一些冗余的位置:

  1. 的数据类型要转换为(这可能是一样的字段)的数据类型,
  2. 在阵列中的位置(其是相同的在其中写语句)的顺序,
  3. 结果变量的名称,
  4. 的流的名称。

让我们试图摆脱它们。我们将使用方法重载删除(1),(2)使用自动递增的位置变量,(3)使用较短的变量名称,以及(4)通过将转换代码提取到方法中。

下面的代码是未经测试,但这个想法应该是显而易见的:

Public Function ParseStream(pstrStream As String) As SUB_PNDGORDR_QRY_RESP 
    Dim p As New Parser(pstrStream) 
    Dim r As New SUB_PNDGORDR_QRY_RESP() 
    With r 
     p.ParseField(.ClientId) 
     p.ParseField(.PortfolioId) 
     p.ParseField(.Currency) 
     ... 
    End With 

    Return r 
End Function 

Private Class Parser 
    Public Sub New(pstrStream As String) 
     Me.lstrarrStream = pstrStream.Split("|"c) 
    End Sub 

    Private pos As Integer = 0 
    Private lstrarrStream As String() 

    Public Sub ParseField(ByRef field As Char()) 
     field = CType(lstrarrStream(pos), Char()) 
     pos += 1 
    End Sub 

    Public Sub ParseField(ByRef field As Short) 
     field = CShort(lstrarrStream(pos)) 
     pos += 1 
    End Sub 

    ... other ParseField overloads... 
End Class