2011-11-18 67 views
11
for(int k=0;k <= odds.GetLength(-1);k++) 

Dòng mã trên được cho là lặp qua một mảng hai chiều kiểu Double nhưng tiếp tục ném ngoại lệ sau đây. Chỉ Số Ngoài Phạm Vi Ngoại Lệ. Ai đó có thể tử tế, đủ để giải thích tại sao và cung cấp một giải pháp. Cảm ơn nhiều.Lặp lại qua mảng 2 chiều C#

+0

Bạn có thay đổi nội dung của 'tỷ lệ cược' tại bất kỳ điểm nào trong vòng lặp không? – ChrisBint

+0

Tôi nghĩ bạn nên thêm mã. Có lẽ bạn có thể sử dụng một foreach? –

+0

Có theo cách sau 'code'win + = tỷ lệ cược [1, k] * unitStake; 'code' – user995689

Trả lời

35

Bạn đang chuyển một chỉ mục không hợp lệ đến GetLength. Kích thước của một mảng đa chiều là 0 dựa, vì vậy -1 không hợp lệ và sử dụng số âm (hoặc số lớn hơn số thứ nguyên - 1) sẽ gây ra một số IndexOutOfRangeException.

Điều này sẽ lặp trên kích thước đầu tiên:

for(int k=0;k < odds.GetLength(0);k++) 

Bạn cần thêm một vòng lặp để đi qua các khía cạnh thứ hai:

for(int k=0;k < odds.GetLength(0);k++) 
    for(int l=0;l < odds.GetLength(1);l++) 
     var val = odds[k,l]; 
+0

Tuyệt đối tuyệt vời! Cảm ơn nhiều! – user995689

+0

phần có điều kiện của các vòng lặp phải chỉ định '<' thay vì '<=' hoặc bạn sẽ thoát khỏi chỉ mục ngoại lệ. – John

+0

@John - cảm ơn. Bạn có thể đã đề nghị chỉnh sửa trực tiếp mặc dù :) – Oded

3

Nếu odds là một mảng hai chiều, thì kích thước của nó sẽ được gọi là 01. Cố gắng truy cập thứ nguyên -1 sẽ mang lại một số IndexOutOfRangeException.

1

GetLength là không dựa trên. Hãy thử gọi GetLength(0).

3

Vâng, thường khi bạn muốn lặp trên mảng 2D:

for(int col = 0; col < arr.GetLength(0); col++) 
    for(int i = row; row < arr.GetLength(1); row++) 
     arr[col,row] = /*something*/; 

Mảng luôn bằng zero-based, vì vậy không có điểm cố gắng để có được một cái gì đó ở -1 chỉ mục.

0

Tôi nhìn thấy một hoặc hai vấn đề tùy thuộc vào cách bạn định sử dụng nó:

Trước hết, getLength (ind chiều) trả về chiều dài của chiều quy định, bắt đầu từ 0. Trong trường hợp của một mảng hai chiều, chỉ số chính xác sẽ là 0 và 1.

Vấn đề thứ hai là bạn đang thực hiện < = thay vì < đối với điều kiện vòng lặp, điều này cũng có thể vượt quá giới hạn vì chỉ số cuối cùng là độ dài-1 và không dài.

StriplingWarrior và Gilad Naaman đã đăng các ví dụ mã nên tôi sẽ bỏ qua điều đó.

+0

Cảm ơn bạn đã chỉ ra vấn đề với <= nó không được rõ ràng cho đến bây giờ với các vấn đề khác tôi đã có, nhưng bây giờ bình luận của bạn đã giúp. Ty. – user995689

2
string[,] arr = new string[2, 3]; 
     arr[0, 0] = "0,0"; 
     arr[0, 1] = "0,1"; 
     arr[0, 2] = "0,2"; 

     arr[1, 0] = "1,0"; 
     arr[1, 1] = "1,1"; 
     arr[1, 2] = "1,2"; 

     for (int i = 0; i < arr.GetLength(0); i++) 
     { 
      for (int j = 0; j < arr.GetLength(1); j++) 
      { 
       Response.Write(string.Format("{0}\t", arr[i, j])); 
      } 
      Response.Write("<br/>"); 
     }