2017-02-23 197 views
0

停我的任务的这一部分,我需要做到以下几点:for循环后1迭代

创建一个返回字符串类型的键和整数类型值的排序列表的功能。在函数内部,声明一个与函数返回类型具有相同结构的新排序列表。然后,使用嵌套for循环填充排序列表,查看产品列表和年份列表,以便将产品和年份连接在一起以创建密钥,并从需求表数组中获取相应的需求值作为值将此键输入到排序列表中。

我已经写了下面的代码来做到这一点,但是它在1次迭代后会抛出System.ArgumentException在System.dll中。测试MessageBox将只显示“ModelX 2013 205”,然后将引发错误。

Public Function GetProductDemand() As SortedList(Of String, Integer) 
    Dim prodDemand As New SortedList(Of String, Integer) 

    Dim count As Integer = 0 
    For Each product In products 
     For Each yr In years 
      Dim key As String 
      key = product & " " & yr 
      For i As Integer = 0 To 4 
       prodDemand.Add(key, demand(count, i)) 'stops here after 1 iteration 
       MessageBox.Show(key & " " & prodDemand(key)) 'test to display results 
      Next 
     Next 
     count += 1 
    Next 
    Return prodDemand 
End Function 

为什么会出现这种情况?下面是相关的代码的其余部分:

Dim products As List(Of String) 
Dim years As List(Of String) 
Dim demandList As SortedList(Of String, Integer) 
Dim demand As Integer(,) 

Private Sub frmDemand_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    products = GetProducts() 
    years = GetYears() 
    demand = GetDemand() 
    demandList = GetProductDemand() 
End Sub 

Private Function GetDemand() As Integer(,) 
    Return { 
      {205, 220, 245, 230}, 
      {160, 174, 152, 144}, 
      {480, 424, 396, 456} 
      } 
End Function 

Public Function GetProducts() As List(Of String) 
    Dim prods As New List(Of String) 
    prods.Add("ModelX") 
    prods.Add("ModelY") 
    prods.Add("ModelZ") 
    Return prods 
End Function 

Public Function GetYears() As List(Of String) 
    Dim yr As New List(Of String) 
    yr.Add("2013") 
    yr.Add("2014") 
    yr.Add("2015") 
    yr.Add("2016") 
    Return yr 
End Function 
+0

'prodDemand.Add(key,demand(count,i))'我们可以看到prodDemand和demand吗?我认为你在循环的第二次迭代中用不正确的参数来调用它/它们。 –

+0

@ blaze_125:你是对的 - “SortedList”基本上是一个字典,并且多次添加相同的键会引发错误(重复键)。 –

回答

1

我看问题的陈述更接近。我不认为你需要最内层的循环。这里的答案是基于列表的索引:

Public Function GetProductDemand() As SortedList(Of String, Integer) 
    Dim prodDemand As New SortedList(Of String, Integer) 
    For i = 0 To products.Length - 1 
     For j As Integer = 0 To years.Length - 1 
      Dim key As String = String.Format("{0} {1}", products(i), years(j)) 
      prodDemand.Add(key, demand(i, j)) 
      MessageBox.Show(key & " " & prodDemand(key)) 'test to display results 
     Next 
    Next 
    Return prodDemand 
End Function 
+0

谢谢你指出。我做了改变,但同样的事情仍在发生。 –

+0

啊我明白了。我试图解决的问题是在帖子的开头。也许你可以建议一个更好的方法来做到这一点?问题措辞的方式有点混乱。 –

+0

@TheGamingGrunts:在仔细阅读问题之后,我认为你完全不需要'For I As Integer = 0 To 4'循环。我会更新我的答案。 –