2017-07-26 46 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

一个班级成员没有被重新定义。我仍然无法包装我的头,因为只有当我逐步完成代码时,为什么只能正确创建字符串数组......显然最终用户不具备这种能力。 –