2015-04-23 94 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