Vb.net 正在尝试创建包含100行和3列的多维数组

Vb.net 正在尝试创建包含100行和3列的多维数组,vb.net,multidimensional-array,Vb.net,Multidimensional Array,这里是VB初学者。 我需要创建的数组是3列100行。 第一列是一个整数,每行增加2。 第二列是增加15天的日期。 第三栏与第二栏相似,但从另一天开始 我在下面有一些代码,我试过了,但仍然不知道该怎么做。 非常感谢你能在这方面帮助我 Private Sub AutopayPayPeriod() Dim row As Int32 Dim AutopayArray(0 To 10, 0 To 2) Dim RCN As Int32 = row

这里是VB初学者。 我需要创建的数组是3列100行。 第一列是一个整数,每行增加2。 第二列是增加15天的日期。 第三栏与第二栏相似,但从另一天开始

我在下面有一些代码,我试过了,但仍然不知道该怎么做。 非常感谢你能在这方面帮助我

Private Sub AutopayPayPeriod()
        Dim row As Int32
        Dim AutopayArray(0 To 10, 0 To 2)
        Dim RCN As Int32 = row
        Dim PayPeriodStart, PayPeriodEnd As Date
        Dim index As Int32
        RCN = 1
        PayPeriodStart = Format(#12/12/2015#, "Short Date")
        PayPeriodEnd = Format(#12/25/2015#, "Short Date")

        For index = 1 To AutopayArray.Length - 1
            AutopayArray(0, 2) = {RCN, PayPeriodStart, PayPeriodEnd}
            PayPeriodStart = PayPeriodStart.AddDays(15)
            PayPeriodEnd = PayPeriodEnd.AddDays(15)
            RCN += 2
            index += 1
            Array.Resize(ByRef AutopayArray, (AutopayArray.Length+=1))

        Next

    End Sub

多维数组是错误的数据结构,因为您有不同的数据类型。此外,在代码中使用普通数组会模糊代码的意图,因为没有适当的文档,没有人能够猜出条目的含义

您应该使用正确类型的类或结构,这取决于您使用它的方式。在下面,我将用一个类显示变量:

您可能需要更改的第二件事是使用PeriodInformation列表而不是数组,因为添加和删除项要简单得多。如果坚持使用数组,请在开始时调整一次大小,而不是每次调整一次

最后,不要使用日期的字符串表示。使用实际日期

代码如下所示:

Private Function AddAutoPayPeriods(firstPayPeriodStart As Date, firstPayPeriodEnd As Date, firstPayPeriodRCN As Integer, numberOfPeriods As Integer) As List(Of PeriodInformation)
    Dim result As New List(Of PeriodInformation)
    For i As Integer = 1 To numberOfPeriods
        result.Add(New PeriodInformation With {.RCN = firstPayPeriodRCN, .StartDate = firstPayPeriodStart, .EndDate = firstPayPeriodEnd})
        firstPayPeriodStart = firstPayPeriodStart.AddDays(15)
        firstPayPeriodEnd = firstPayPeriodEnd.AddDays(15)
        firstPayPeriodRCN += 2
    Next
    Return result
End Function
1, 12/12/2015, 12/25/2015
3, 12/27/2015, 1/9/2016
5, 1/11/2016, 1/24/2016
7, 1/26/2016, 2/8/2016
9, 2/10/2016, 2/23/2016
11, 2/25/2016, 3/9/2016
13, 3/11/2016, 3/24/2016
15, 3/26/2016, 4/8/2016
17, 4/10/2016, 4/23/2016
19, 4/25/2016, 5/8/2016
21, 5/10/2016, 5/23/2016
23, 5/25/2016, 6/7/2016
25, 6/9/2016, 6/22/2016
27, 6/24/2016, 7/7/2016
29, 7/9/2016, 7/22/2016
31, 7/24/2016, 8/6/2016
33, 8/8/2016, 8/21/2016
35, 8/23/2016, 9/5/2016
37, 9/7/2016, 9/20/2016
39, 9/22/2016, 10/5/2016
41, 10/7/2016, 10/20/2016
43, 10/22/2016, 11/4/2016
45, 11/6/2016, 11/19/2016
47, 11/21/2016, 12/4/2016
49, 12/6/2016, 12/19/2016
51, 12/21/2016, 1/3/2017
53, 1/5/2017, 1/18/2017
55, 1/20/2017, 2/2/2017
57, 2/4/2017, 2/17/2017
59, 2/19/2017, 3/4/2017
61, 3/6/2017, 3/19/2017
63, 3/21/2017, 4/3/2017
65, 4/5/2017, 4/18/2017
67, 4/20/2017, 5/3/2017
69, 5/5/2017, 5/18/2017
71, 5/20/2017, 6/2/2017
73, 6/4/2017, 6/17/2017
75, 6/19/2017, 7/2/2017
77, 7/4/2017, 7/17/2017
79, 7/19/2017, 8/1/2017
81, 8/3/2017, 8/16/2017
83, 8/18/2017, 8/31/2017
85, 9/2/2017, 9/15/2017
87, 9/17/2017, 9/30/2017
89, 10/2/2017, 10/15/2017
91, 10/17/2017, 10/30/2017
93, 11/1/2017, 11/14/2017
95, 11/16/2017, 11/29/2017
97, 12/1/2017, 12/14/2017
99, 12/16/2017, 12/29/2017
101, 12/31/2017, 1/13/2018
103, 1/15/2018, 1/28/2018
105, 1/30/2018, 2/12/2018
107, 2/14/2018, 2/27/2018
109, 3/1/2018, 3/14/2018
111, 3/16/2018, 3/29/2018
113, 3/31/2018, 4/13/2018
115, 4/15/2018, 4/28/2018
117, 4/30/2018, 5/13/2018
119, 5/15/2018, 5/28/2018
121, 5/30/2018, 6/12/2018
123, 6/14/2018, 6/27/2018
125, 6/29/2018, 7/12/2018
127, 7/14/2018, 7/27/2018
129, 7/29/2018, 8/11/2018
131, 8/13/2018, 8/26/2018
133, 8/28/2018, 9/10/2018
135, 9/12/2018, 9/25/2018
137, 9/27/2018, 10/10/2018
139, 10/12/2018, 10/25/2018
141, 10/27/2018, 11/9/2018
143, 11/11/2018, 11/24/2018
145, 11/26/2018, 12/9/2018
147, 12/11/2018, 12/24/2018
149, 12/26/2018, 1/8/2019
151, 1/10/2019, 1/23/2019
153, 1/25/2019, 2/7/2019
155, 2/9/2019, 2/22/2019
157, 2/24/2019, 3/9/2019
159, 3/11/2019, 3/24/2019
161, 3/26/2019, 4/8/2019
163, 4/10/2019, 4/23/2019
165, 4/25/2019, 5/8/2019
167, 5/10/2019, 5/23/2019
169, 5/25/2019, 6/7/2019
171, 6/9/2019, 6/22/2019
173, 6/24/2019, 7/7/2019
175, 7/9/2019, 7/22/2019
177, 7/24/2019, 8/6/2019
179, 8/8/2019, 8/21/2019
181, 8/23/2019, 9/5/2019
183, 9/7/2019, 9/20/2019
185, 9/22/2019, 10/5/2019
187, 10/7/2019, 10/20/2019
189, 10/22/2019, 11/4/2019
191, 11/6/2019, 11/19/2019
193, 11/21/2019, 12/4/2019
195, 12/6/2019, 12/19/2019
197, 12/21/2019, 1/3/2020
199, 1/5/2020, 1/18/2020
我们可以这样调用此函数:

Dim periods = AddAutoPayPeriods(#12/12/2015#, #12/25/2015#, 1, 10)
最后,通过简单地打印所有元素来检查我们得到了什么:

For Each period In periods
    Console.WriteLine($"{period.RCN}: {period.StartDate:d} - {period.EndDate:d}")
Next
哪张照片

1: 12-Dec-15 - 25-Dec-15
3: 27-Dec-15 - 09-Jan-16
5: 11-Jan-16 - 24-Jan-16
7: 26-Jan-16 - 08-Feb-16
9: 10-Feb-16 - 23-Feb-16
11: 25-Feb-16 - 09-Mar-16
13: 11-Mar-16 - 24-Mar-16
15: 26-Mar-16 - 08-Apr-16
17: 10-Apr-16 - 23-Apr-16
19: 25-Apr-16 - 08-May-16

请尝试使用此方法:

Private Sub AutopayPayPeriod()
    Dim myArray(2) 'as colomns
    Dim myRows As New ArrayList 'as rows
    Dim PayPeriodStart = Format(#12/12/2015#, "Short Date")
    Dim PayPeriodEnd = Format(#12/25/2015#, "Short Date")

    For myIdx = 1 To 100
        myArray = {(myIdx - 1) * 2 + 1, PayPeriodStart, PayPeriodEnd}
        PayPeriodStart = Format(CDate(PayPeriodStart).AddDays(15), "Short Date")
        PayPeriodEnd = Format(CDate(PayPeriodEnd).AddDays(15), "Short Date")
        myRows.Add(myArray)
    Next
    For myIdx = 1 To 100
        Debug.Print(myRows.Item(myIdx - 1)(0) & ", " & myRows.Item(myIdx - 1)(1) & ", " & myRows.Item(myIdx - 1)(2))
    Next

End Sub
结果如下:

Private Function AddAutoPayPeriods(firstPayPeriodStart As Date, firstPayPeriodEnd As Date, firstPayPeriodRCN As Integer, numberOfPeriods As Integer) As List(Of PeriodInformation)
    Dim result As New List(Of PeriodInformation)
    For i As Integer = 1 To numberOfPeriods
        result.Add(New PeriodInformation With {.RCN = firstPayPeriodRCN, .StartDate = firstPayPeriodStart, .EndDate = firstPayPeriodEnd})
        firstPayPeriodStart = firstPayPeriodStart.AddDays(15)
        firstPayPeriodEnd = firstPayPeriodEnd.AddDays(15)
        firstPayPeriodRCN += 2
    Next
    Return result
End Function
1, 12/12/2015, 12/25/2015
3, 12/27/2015, 1/9/2016
5, 1/11/2016, 1/24/2016
7, 1/26/2016, 2/8/2016
9, 2/10/2016, 2/23/2016
11, 2/25/2016, 3/9/2016
13, 3/11/2016, 3/24/2016
15, 3/26/2016, 4/8/2016
17, 4/10/2016, 4/23/2016
19, 4/25/2016, 5/8/2016
21, 5/10/2016, 5/23/2016
23, 5/25/2016, 6/7/2016
25, 6/9/2016, 6/22/2016
27, 6/24/2016, 7/7/2016
29, 7/9/2016, 7/22/2016
31, 7/24/2016, 8/6/2016
33, 8/8/2016, 8/21/2016
35, 8/23/2016, 9/5/2016
37, 9/7/2016, 9/20/2016
39, 9/22/2016, 10/5/2016
41, 10/7/2016, 10/20/2016
43, 10/22/2016, 11/4/2016
45, 11/6/2016, 11/19/2016
47, 11/21/2016, 12/4/2016
49, 12/6/2016, 12/19/2016
51, 12/21/2016, 1/3/2017
53, 1/5/2017, 1/18/2017
55, 1/20/2017, 2/2/2017
57, 2/4/2017, 2/17/2017
59, 2/19/2017, 3/4/2017
61, 3/6/2017, 3/19/2017
63, 3/21/2017, 4/3/2017
65, 4/5/2017, 4/18/2017
67, 4/20/2017, 5/3/2017
69, 5/5/2017, 5/18/2017
71, 5/20/2017, 6/2/2017
73, 6/4/2017, 6/17/2017
75, 6/19/2017, 7/2/2017
77, 7/4/2017, 7/17/2017
79, 7/19/2017, 8/1/2017
81, 8/3/2017, 8/16/2017
83, 8/18/2017, 8/31/2017
85, 9/2/2017, 9/15/2017
87, 9/17/2017, 9/30/2017
89, 10/2/2017, 10/15/2017
91, 10/17/2017, 10/30/2017
93, 11/1/2017, 11/14/2017
95, 11/16/2017, 11/29/2017
97, 12/1/2017, 12/14/2017
99, 12/16/2017, 12/29/2017
101, 12/31/2017, 1/13/2018
103, 1/15/2018, 1/28/2018
105, 1/30/2018, 2/12/2018
107, 2/14/2018, 2/27/2018
109, 3/1/2018, 3/14/2018
111, 3/16/2018, 3/29/2018
113, 3/31/2018, 4/13/2018
115, 4/15/2018, 4/28/2018
117, 4/30/2018, 5/13/2018
119, 5/15/2018, 5/28/2018
121, 5/30/2018, 6/12/2018
123, 6/14/2018, 6/27/2018
125, 6/29/2018, 7/12/2018
127, 7/14/2018, 7/27/2018
129, 7/29/2018, 8/11/2018
131, 8/13/2018, 8/26/2018
133, 8/28/2018, 9/10/2018
135, 9/12/2018, 9/25/2018
137, 9/27/2018, 10/10/2018
139, 10/12/2018, 10/25/2018
141, 10/27/2018, 11/9/2018
143, 11/11/2018, 11/24/2018
145, 11/26/2018, 12/9/2018
147, 12/11/2018, 12/24/2018
149, 12/26/2018, 1/8/2019
151, 1/10/2019, 1/23/2019
153, 1/25/2019, 2/7/2019
155, 2/9/2019, 2/22/2019
157, 2/24/2019, 3/9/2019
159, 3/11/2019, 3/24/2019
161, 3/26/2019, 4/8/2019
163, 4/10/2019, 4/23/2019
165, 4/25/2019, 5/8/2019
167, 5/10/2019, 5/23/2019
169, 5/25/2019, 6/7/2019
171, 6/9/2019, 6/22/2019
173, 6/24/2019, 7/7/2019
175, 7/9/2019, 7/22/2019
177, 7/24/2019, 8/6/2019
179, 8/8/2019, 8/21/2019
181, 8/23/2019, 9/5/2019
183, 9/7/2019, 9/20/2019
185, 9/22/2019, 10/5/2019
187, 10/7/2019, 10/20/2019
189, 10/22/2019, 11/4/2019
191, 11/6/2019, 11/19/2019
193, 11/21/2019, 12/4/2019
195, 12/6/2019, 12/19/2019
197, 12/21/2019, 1/3/2020
199, 1/5/2020, 1/18/2020

net中另一个有用的类是DataTable。在处理行和列时,这可能是一个很好的匹配

Private Function CreatePayPeriods(RCN As Integer, PayPeriodStart As Date, PayPeriodEnd As Date, NumberOfPeriods As Integer) As DataTable
    Dim dt As New DataTable()
    dt.Columns.Add("RCN", GetType(Integer))
    dt.Columns.Add("Pay Period Start Date", GetType(Date))
    dt.Columns.Add("Pay Period End Date", GetType(Date))
    For i = 1 To NumberOfPeriods
        dt.Rows.Add(RCN, PayPeriodStart, PayPeriodEnd)
        PayPeriodStart = PayPeriodStart.AddDays(15)
        PayPeriodEnd = PayPeriodEnd.AddDays(15)
        RCN += 2
    Next
    Return dt
End Function
看看结果

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DataGridView1.DataSource = CreatePayPeriods(1, #1/02/2017#, #1/9/2017#, 100)
End Sub
另一种方法是:

Private Sub AutopayPayPeriod()
    Dim myArray(2) 'as colomns
    Dim myRows As New Collection'as rows
    Dim PayPeriodStart = Format(#12/12/2015#, "Short Date")
    Dim PayPeriodEnd = Format(#12/25/2015#, "Short Date")

    For myIdx = 1 To 100
        myArray = {(myIdx - 1) * 2 + 1, PayPeriodStart, PayPeriodEnd}
        PayPeriodStart = Format(CDate(PayPeriodStart).AddDays(15), "Short Date")
        PayPeriodEnd = Format(CDate(PayPeriodEnd).AddDays(15), "Short Date")
        myRows.Add(myArray)
    Next
    For myIdx = 1 To 100
        Debug.Print(myRows.Item(myIdx)(0) & ", " & myRows.Item(myIdx)(1) & ", " & myRows.Item(myIdx)(2))
    Next

End Sub

但是,正如Mary所说,使用table的最佳方法是

感谢tour的贡献,它很有意义,我今天晚些时候会尝试,您可以向设置属性的类添加构造函数。这将使新代码变得更简单。老实说,Nico,你的解决方案和Mary都很棒,我面临着选择赢家的两难选择。只要选择你觉得更舒服的。数据结构的选择也在很大程度上取决于实际用例。所以,只要选择一个——没有人会对你生气。从MS文档中,我们不建议你在新的开发中使用ArrayList类。谢谢你,你为我提供了很多方法如何达到同样的效果。现在我想我会选择Mary的答案作为选择,因为它更方便用户。老实说,Nico,你的解决方案和Mary都很棒,我面临着选择获胜者的两难选择。我想说,您的将是一个问题,因为如果我要搜索特定的RCN,我将需要再次触发循环,而不是将它们保存到表中。也许我不够清楚,我必须道歉,但如果我要做一次打印日期清单的报告,我肯定会选择你的。Mary的解决方案更加用户友好,因为我认为我需要的是数据网格视图。谢谢你的贡献,我会把它作为学习笔记。