2017-07-26 43 views
-1

我有以下的代碼的尺寸和填充一個26長度字符串數組:奇數For循環行爲與字符串數組

Dim intAllWeights As Integer = intFrontWeights + intKingpinWeights + 
    intLandingLegWeights + intCenterWeights + intBogieWeights + intRearWeights 
    Dim AllWeightsString(intAllWeights - 1) As String 
    Dim k As Integer = 1 
    For j = 1 To intFrontWeights 
     AllWeightsString(k - 1) = ("F - " + strFrontWeightDescription(j - 1) + ": " + "(x" + intFrontWeightQuantity(j - 1).ToString + "), " + dblFrontWeightWeight(j - 1).ToString + Pounds + ", " + dblFrontWeightOffset(j - 1).ToString + Inches) 
     k = k + 1 
    Next 
    For j = 1 To intKingpinWeights 
     AllWeightsString(k - 1) = ("K - " + strKingpinWeightDescription(j - 1) + ": " + "(x" + intKingpinWeightQuantity(j - 1).ToString + "), " + dblKingpinWeightWeight(j - 1).ToString + Pounds + ", " + dblKingpinWeightOffset(j - 1).ToString + Inches) 
     k = k + 1 
    Next 
    For j = 1 To intLandingLegWeights 
     AllWeightsString(k - 1) = ("L - " + strLandingLegWeightDescription(j - 1) + ": " + "(x" + intLandingLegWeightQuantity(j - 1).ToString + "), " + dblLandingLegWeightWeight(j - 1).ToString + Pounds + ", " + dblLandingLegWeightOffset(j - 1).ToString + Inches) 
     k = k + 1 
    Next 
    For j = 1 To intCenterWeights 
     AllWeightsString(k - 1) = ("C - " + strCenterWeightDescription(j - 1) + ": " + "(x" + intCenterWeightQuantity(j - 1).ToString + "), " + dblCenterWeightWeight(j - 1).ToString + Pounds + ", " + dblCenterWeightOffset(j - 1).ToString + Inches) 
     k = k + 1 
    Next 
    For j = 1 To intBogieWeights 
     AllWeightsString(k - 1) = ("B - " + strBogieWeightDescription(j - 1) + ": " + "(x" + intBogieWeightQuantity(j - 1).ToString + "), " + dblBogieWeightWeight(j - 1).ToString + Pounds + ", " + dblBogieWeightOffset(j - 1).ToString + Inches) 
     k = k + 1 
    Next 
    For j = 1 To intRearWeights 
     AllWeightsString(k - 1) = ("R - " + strRearWeightDescription(j - 1) + ": " + "(x" + intRearWeightQuantity(j - 1).ToString + "), " + dblRearWeightWeight(j - 1).ToString + Pounds + ", " + dblRearWeightOffset(j - 1).ToString + Inches) 
     k = k + 1 
    Next 

當我通過代碼行由行步驟,我得到這樣的結果: enter image description here

當我打破了這個代碼後一直沒有去行由行跑了,我得到這個: enter image description here

正如你可以看到,25日指數不被設置等於任何東西,如果我不要F8-ste通過我的代碼。任何想法爲什麼發生這種情況?很困惑。

回答

2

你可以減少這種代碼相當:

Dim buildStrings As Func(Of String, String(), Integer(), Double(), Double(), IEnumerable(Of String)) = _ 
    Function(Prefix, Description, Quantity, Weight, Offset) 
     Dim Length As Integer = Description.Length 
     Return Enumerable.Range(0, Length).Select(Function(j) _ 
      String.Format("{0} - {1}:(x{2}), {3}{4}, {5}{6}", 
       Prefix, Description(j), Quantity(j), Weight(j), Pounds, Offset(j), Inches)) 
    End Function 

Dim FrontStrings = buildStrings("F", strFrontWeightDescription,  intFrontWeightQuantity,  dblFrontWeightWeight,  dblFrontWeightOffset) 
Dim KingpinStrings = buildStrings("K", strKingpinWeightDescription, intKingpinWeightQuantity, dblKingpinWeightWeight, dblKingpinWeightOffset) 
Dim LandingStrings = buildStrings("L", strLandingLegWeightDescription, intLandingLegWeightQuantity, dblLandingLegWeightWeight, dblLandingLegWeightOffset) 
Dim CenterStrings = buildStrings("C", strCenterWeightDescription,  intCenterWeightQuantity,  dblCenterWeightWeight,  dblCenterWeightOffset) 
Dim BogieStrings = buildStrings("B", strBogieWeightDescription,  intBogieWeightQuantity,  dblBogieWeightWeight,  dblBogieWeightOffset) 
Dim RearStrings = buildStrings("R", strRearWeightDescription,  intRearWeightQuantity,  dblRearWeightWeight,  dblRearWeightOffset) 

Dim AllWeightsString = FrontStrings.Concat(KingpinStrings).Concat(LandingStrings).Concat(CenterStrings).Concat(BogieStrings).Concat(RearStrings). 
         ToArray() 

這似乎是在第一個更復雜,尤其是在匿名函數和LINQ的功能不熟悉,但通過減少重複和總代碼,它實際上更容易在長遠的理解。

通過使用Class es,而不是分組數組,您可以使這更好,更簡單。使用數組通過索引匹配數據是一種應該避免的反模式。這是一類可能是什麼樣子:

Public Enum WeightType 
    Front 
    Kingpin 
    LandingLeg 
    Center 
    Bogie 
    Rear 
End Enum 

Public Class WeightInfo 
    Const Pounds As String = "[lbs.]" 
    Const Inches As String = "[in]" 

    Public Property Style As WeightType 
    Public Property Description As String 
    Public Property Quantity As Integer 
    Public Property Weight As Double 
    Public Property Offset As Double 

    Public ReadOnly Property StylePrefix As String 
     Get 
      Select Case Style 
       Case WeightType.Front 
        Return "F" 
       Case WeightType.Kingpin 
        Return "K" 
       Case WeightType.LandingLeg 
        Return "L" 
       Case WeightType.Center 
        Return "C" 
       Case WeightType.Bogie 
        Return "B" 
       Case WeightType.Rear 
        Return "R" 
       Case Else 
        Return "" 
      End Select 
     End Get 
    End Property 

    Public Overrides Function ToString() As String 
     Return String.Format("{0} - {1}:(x{2}), {3}{4}, {5}{6}", StylePrefix, Description, Quantity, Weight, Pounds, Offset, Inches) 
    End Function 
End Class 

如果您的數據是建立在類實例的數組,然後將代碼變得更多的東西是這樣的:

Dim AllWeightsString = _ 
     FrontWeights.Select(Function(w) w.ToString).Concat(
     KingpinWeights.Select(Function(w) w.ToString)).Concat(
     LandingLegWeights.Select(Function(w) w.ToString)).Concat(
     CenterWeights.Select(Function(w) w.ToString)).Concat(
     BogieWeights.Select(Function(w) w.ToString)).Concat(
     RearWeights.Select(Function(w) w.ToString)). 
     ToArray() 

語義上說,這只是一條線的代碼。你可以更好地把所有的數據放在ONE大集合(而不是數組)中,你可以根據需要按照類型使用Where()進行過濾。例如:

Dim FrontWeights = AllMyWeights.Where(Function(w) w.Style = WeightType.Front) 
+0

我運行此代碼並且AllWeightsString爲Nothing。另外,爲了我的意圖,我需要一個字符串數組。 –

+0

這將產生一個字符串數組,但我懷疑你真的可以通過IEnumerable(Of String)來獲得,它會表現得更好。確保你跑過最後一行。 AllWeightsString直到該行完成後才分配。如果你停在那裏的斷點,你什麼都看不到。哦,你是否可能在方法中重新定義一個類成員變量? –

+0

一個班級成員沒有被重新定義。我仍然無法包裝我的頭,因爲只有當我逐步完成代碼時,爲什麼只能正確創建字符串數組......顯然最終用戶不具備這種能力。 –