2011-07-12 54 views
0

多次元配列を初期化しようとしています。ここに私の構文があります。これはエラーを作成しませんが、すべての値も格納しません。それは正しくVB.NETで多次元配列を初期化する方法

 dFirstWeek = CDate(FirstWeek) 
     dFirstWeek = DateAdd(DateInterval.WeekOfYear, -1, dFirstWeek) 

     Dim dFirstDay As Date 
     Dim arrWeekYear(5000, 1) As Date 
     Dim i As Integer = 0 
     Dim j As Integer = 0 
     dFirstDay = dFirstDay.AddDays(1) 

     While dFirstWeek <= dLastWeek 
      dFirstDay = dFirstWeek 
      dFirstWeek = dFirstWeek.AddDays(7) 

      While dFirstDay < dFirstWeek 
       arrWeekYear(i, j) = (dFirstWeek) 
       arrWeekYear(i, j + 1) = (dFirstDay) 

       Response.Write(arrWeekYear(i, j).ToString("d")) 
       Response.Write("   ;") 
       Response.Write(arrWeekYear(i, j + 1).ToString("d")) 
       Response.Write("<br>") 
       dFirstDay = dFirstDay.AddDays(1) 
       j = 0 
      End While 
      i = i + 1 
     End While 

後に、このコードでは、このスニペット内のすべてのレコードを出力し、私は次のようにこの配列を転載しようとするものの:

  i = 0 
      j = 0 
      Dim k As Integer = 0 
      'Response.Write(arrWeekYear.GetLength(0)) 

      While k < arrWeekYear.GetLength(0) - 2 
       Response.Write(arrWeekYear(i, j).ToString("d")) 
       Response.Write("   ;") 
       Response.Write(arrWeekYear(i, j + 1).ToString("d")) 
       Response.Write("<br>") 
       j = 0 
       i = i + 1 
       k = k + 1 
      End While 

今回、唯一の「J」のレコードが表示されます"i"レコードごと。どうしてこれなの?そして、これらのいくつかのレコードの後に​​、ヌル日付に似た多くの日付が表示されます: "1/1/0001"

なぜ、すべてのレコードは上のセクションに表示されますが、この配列に値を誤って挿入しましたか?また、行数が固定されている必要はなく、固定数の列が必要です。

+0

vb.netのどのバージョン? –

答えて

1
Dim arrWeekYear(5000, 1) As Date 

これは多次元の配列ですが、2番目の次元のサイズは2です。そして、jでアクセスします。コードは常にです。それは意味をなさない。それは本当にあなたが望むものですか?多次元配列ではなく、配列内のデータ構造を使用することをお勧めします。

実際、多次元配列を使用することはほとんどありません。まったく。複雑なオブジェクトは、ほとんど常により適切です。唯一の例外は、実際に数学的行列を保存したいときです。

+0

彼は時々j + 1を使いますが、私はそれが愚かであることに同意します。 _あなたが推薦するように、数学をハードコーディングしたり、インデックスをハードコードしたり、実際のオブジェクトを作成したりすることになります。 –

+0

これに同意するには、線形配列で 'Structure {FirstWeek、FirstDay} 'を使用してください。 – ja72

1

iは、外側のループの内側ではなく内側のループの内側にあります。

そして、さらに簡単なコード(Visual Studioの2010が必要です):

Dim baseDate As Datetime = Convert.ToDatetime(FirstWeek).AddDays(-7) 

For Each item In Enumerable.Range(0, (dLastWeek - baseDate).TotalDays/7) _ 
     .Select(Function(i) New DateTime() _ 
      {baseDate.AddDays(i*7), baseDate.AddDays(i*7 + 7) }) 

    Response.Write(string.Format("{0:d}  ;{1:d}<br/>", item(0), item(1))) 
Next item 

とのResponse.Write以来の()はasp.netに眉をひそめている、あなたはさらに一歩これを取るとEnumerable.Rangeを割り当てることができますmvcではなくwebformを使用している場合、asp:repeaterコントロールのデータソースとして呼び出します。

0

最初の部分では、同じ配列行に7倍の値を書き込んでいます。 テスト(2011年1月1日から03/03/2011まで)の最初の21件は次のとおりです。

i | j |値| j + 1 |値

0 | 0 | 01/01/2011 | 1 | 25/12/2010

0 | 0 | 01/01/2011 | 1 | 26/12/2010

0 | 0 | 01/01/2011 | 1 | 27/12/2010

0 | 0 | 01/01/2011 | 1 | 28/12/2010

0 | 0 | 01/01/2011 | 1 | 29/12/2010

0 | 0 | 01/01/2011 | 1 | 30/12/2010

0 | 0 | 01/01/2011 | 1 | 31/12/2010配列(0,0)および(0,1)の最終値

1 | 0 | 08/01/2011 | 1 | 01/01/2011

1 | 0 | 08/01/2011 | 1 | 02/01/2011

1 | 0 | 08/01/2011 | 1 | 03/01/2011

1 | 0 | 08/01/2011 | 1 | 04/01/2011

1 | 0 | 08/01/2011 | 1 | 05/01/2011

1 | 0 | 08/01/2011 | 1 | 06/01/2011

1 | 0 | 08/01/2011 | 1 | 07/01/2011配列(1,0)および1,1の最終値)

2 | 0 | 15/01/2011 | 1 | 08/01/2011

2 | 0 | 15/01/2011 | 1 | 09/01/2011

2 | 0 | 15/01/2011 | 1 | 10/01/2011

2 | 0 | 15/01/2011 | 1 | 11/01/2011

2 | 0 | 15/01/2011 | 1 | 12/01/2011

2 | 0 | 15/01/2011 | 1 | 13/01/2011

2 | 0 | 15/01/2011 | 1 | 14/01/2011配列の最終値(2,0)および(2,1)

など

2番目の部分では、次のような値が得られます。 i | j |値| j + 1 |値

0 | 0 | 01/01/2011 | 1 | 31/12/2010

1 | 0 | 08/01/2011 | 1 | 07/01/2011

2 | 0 | 15/01/2011 | 1 | 14/01/2011

3 | 0 | 22/01/2011 | 1 | 21/01/2011

4 | 0 | 29/01/2011 | 1 | 28/01/2011

5 | 0 | 05/02/2011 | 1 | 04/02/2011

6 | 0 | 12/02/2011 | 1 | 11/02/2011

7 | 0 | 19/02/2011 | 1 | 18/02/2011

8 | 0 | 26/02/2011 | 1 | 25/02/2011

9 | 0 | 05/03/2011 | 1 | 04/03/2011

10 | 0 | 01/01/0001 | 1 | 01/01/0001 これは残りの配列の値です。

パート1でいくつかの値を増やすのを忘れたと思いますか?

関連する問題