2012-06-26 32 views
5

Tôi đang sử dụng một mảng int để giữ một danh sách dài các số nguyên. Đối với mỗi phần tử của mảng này, tôi muốn kiểm tra xem nó có phải là 1 hay không, nếu có thì chỉ có liên quan đến 1, nếu nó là 2, hãy thực hiện các công cụ khác có liên quan đến 2 và cứ thế cho mỗi giá trị được lưu trữ trong mảng. Tôi đã đưa ra mã dưới đây nhưng nó không hoạt động như mong đợi, có cái gì đó tôi đang thiếu? Điều đang xảy ra là chỉ có giá trị đầu tiên của mảng đang được xem xét.Đi xe đạp qua nội dung của vấn đề mảng

int[] variable1 = MyClass1.ArrayWorkings(); 
foreach (int i in variable1) 
{ 
    if (variable1[i] == 1) 
    { 
     // arbitrary stuff 
    } 
    else if (variable1[i] ==2) 
    { 
     //arbitrary stuff 
    } 
} 

Trả lời

4

Bạn đang cố gắng làm điều gì đó không có ý nghĩa. Để xem cách nó hoạt động, lấy một ví dụ đơn giản, một mảng với các giá trị: 9, 4, 1.

Nếu bạn cố gắng chạy mã của bạn trên mảng mẫu này, bạn sẽ nhận được một lỗi:

foreach (int i in variable1) 
{ 
    if (variable1[i] == 1) // the item i is 9. 
          // But variable[i] means, get the value at position #9 in the array 
          // Since there are only 3 items in the array, you get an Out Of Range Exception 
    { 
     // arbitrary stuff 
    } 
{ 

Thay vào đó, đây là những gì bạn cần:

foreach (int i in variable1) // i will be 9, then 4, then 1) 
{ 
    if (i == 1) 
    { 
     // arbitrary stuff 
    } 
    // ... etc 
} 

Cách khác là sử dụng một cho vòng lặp, mà sẽ cung cấp cho bạn các chỉ số 0, 1, 2, như thế này:

for (int i=0 ; i<=variable1.Length ; i++) // i will be 0, 1, 2 
              // variable[i] will be 9, 4, 1 
{ 
    if (variable1[i] == 1) 
    { 
     // stuff 
    } 

    // ... etc 
} 
+0

Bạn có nghĩa là 'i == 1', phải không? –

+0

@FilipEkberg cảm ơn, vâng. Tôi hút. – McGarnagle

+0

Điều đó có ý nghĩa, tuy nhiên sau khi thay đổi mã (cho (int i = 0; i <= variable1.Length; i ++) ) nó vẫn chỉ xem xét phần tử đầu tiên – user1166981

8

i trong vòng foreach của bạn giữ giá trị phần tử thực tế từ mảng trong mỗi lần lặp, không phải chỉ mục. Trong mẫu mã cụ thể của bạn, mảng của bạn có thể chỉ chứa số 0, đó là lý do tại sao bạn chỉ nhận được phần tử đầu tiên (bạn luôn sử dụng chỉ mục 0). Do đó, bạn nên kiểm tra i thay vì variable1[i].

Nếu bạn đang đi để kiểm tra đối với các hằng số nguyên khác nhau, một biểu switch là phù hợp hơn, BTW:

foreach (int i in variable1) { 
    switch (i) { 
     case 1: 
      // arbitrary stuff 
      break; 
     case 2: 
      // arbitrary stuff 
      break; 
    } 
} 

switch/case giúp bạn tiết kiệm một số văn bản; nếu bạn kéo giá trị của mình từ bất kỳ nơi nào khác ngoài số i, bạn có thể chỉ cần thay đổi phần (i) trong câu lệnh switch và hơn thế nữa, switch có thể được trình biên dịch đánh giá hiệu quả hơn câu lệnh if - else bị xích.

Lưu ý: Bạn sẽ không thể trực tiếp thay đổi giá trị mảng trong vòng foreach, vì bạn không thể gán bất kỳ thứ gì cho i. Nếu bạn cần phải gán giá trị mảng mới, bạn sẽ phải

  • đếm mình với một biến thêm trong khi vẫn sử dụng foreach hoặc
  • sử dụng một vòng lặp như for và lấy mục tại index hiện chính mình.
2

Viết như thay vì điều này:

foreach (int i in variable1) { 
    if (i == 1) { 
    .... 
0

Các i bạn lấy không phải là chỉ số nhưng giá trị. Vì vậy, hãy kiểm tra i với 1 hoặc 2.

Nếu bạn đang sử dụng vòng lặp thì mã bên trong của bạn sẽ hoạt động hoàn hảo.

int[] variable1 = MyClass1.ArrayWorkings(); 
foreach (int i in variable1) 
{ 
    switch(i) 
    { 
     case 1: 
      // arbitrary stuff 
     break; 
     case 2: 
      //arbitrary stuff 
     break; 
    } 
} 

Thử sử dụng vỏ chuyển đổi. Nhanh hơn nhiều so với bình thường nếu có.

Các vấn đề liên quan