2010-03-09 38 views
11

Tôi đang lặp qua một chuỗi các chuỗi, chẳng hạn như (1/12/1992 xe tải táo 12/10/10 xe đạp màu cam). Chiều dài của mảng sẽ luôn chia hết cho 3. Tôi cần lặp qua mảng và lấy 3 mục đầu tiên (tôi sẽ chèn chúng vào một DB) và sau đó lấy 3 tiếp theo và cứ tiếp tục cho đến khi tất cả họ đã trải qua.C# lặp qua một mảng

//iterate the array 
for (int i = 0; i < theData.Length; i++) 
{ 
    //grab 3 items at a time and do db insert, continue until all items are gone. 'theData' will always be divisible by 3. 
} 
+3

câu hỏi là gì? –

+2

5 câu trả lời được gửi trong vòng 40 giây của nhau, tất cả đều có cùng thông tin (gần như chính xác). Haha. Tốt đẹp. – JasCav

+2

Điều tôi thấy thú vị là năm câu trả lời đã được đăng trong khi tôi viết bài của tôi ... và * không phải là một câu trả lời duy nhất * có ranh giới phía trên bên phải. –

Trả lời

20

Chỉ cần tăng i bởi 3 trong mỗi bước:

Debug.Assert((theData.Length % 3) == 0); // 'theData' will always be divisible by 3 

    for (int i = 0; i < theData.Length; i += 3) 
    { 
     //grab 3 items at a time and do db insert, 
     // continue until all items are gone.. 
     string item1 = theData[i+0]; 
     string item2 = theData[i+1]; 
     string item3 = theData[i+2]; 
     // use the items 
    } 

Để trả lời một số ý kiến, đó là một cho rằng theData.Length là bội số của 3 vì vậy không có cần phải kiểm tra theData.Length-2 như một hướng đi trên. Điều đó sẽ chỉ che giấu lỗi trong các điều kiện tiên quyết.

+0

điểm tốt để nhận xét về ấn bản của bạn – Javier

7

i++ là cách sử dụng tiêu chuẩn của vòng lặp, nhưng không phải là cách duy nhất. Hãy thử incrementing bởi 3 mỗi lần:

for (int i = 0; i < theData.Length - 2; i+=3) 
    { 

     // use theData[i], theData[i+1], theData[i+2] 

    } 
+3

Bạn là người duy nhất cho đến nay, những người sẽ không nhận được một lỗi ngoài giới hạn về lần lặp cuối cùng; thay vào đó, bạn dừng một lần lặp lại. Hãy thử 'i

+0

@mmyers - tâm trí tuyệt vời nghĩ như nhau. :) Đã thay đổi nó rồi.Nhưng tôi không nghĩ rằng kiểm tra là cần thiết anyway, chỉ đưa nó vào bởi vì nó có vẻ hợp lý ... – froadie

+1

1 cho ràng buộc kiểm tra về chiều dài! – FrustratedWithFormsDesigner

3

Không quá khó. Chỉ cần tăng bộ đếm của for vòng 3 mỗi lần lặp và sau đó bù đắp indexer để có được những lô 3 tại một thời điểm:

for(int i=0; i < theData.Length; i+=3) 
{ 
    var item1 = theData[i]; 
    var item2 = theData[i+1]; 
    var item3 = theData[i+2]; 
} 

Nếu chiều dài của mảng không garuanteed là một bội số của ba , bạn cần kiểm tra giới hạn trên với theData.Length - 2.

2

Vòng lặp for của bạn không cần chỉ thêm một vòng lặp. Bạn có thể lặp lại ba.

for(int i = 0; i < theData.Length; i+=3) 
{ 
    string value1 = theData[i]; 
    string value2 = theData[i+1]; 
    string value3 = theData[i+2]; 
} 

Về cơ bản, bạn chỉ sử dụng các chỉ mục để lấy các giá trị trong mảng của mình. Một điểm cần lưu ý ở đây, tôi không kiểm tra xem bạn có đi qua cuối mảng của mình hay không. Hãy chắc chắn rằng bạn đang kiểm tra giới hạn!

+0

Downvote? Để làm gì? (Tôi nhận thấy tất cả các câu trả lời ngoại trừ câu trả lời đầu tiên đã được downvoted. Lame.) – JasCav

+0

đầu tiên ban đầu, nhưng dường như đã được đưa ra. Lạ thật. – froadie

1

này nên làm việc:

//iterate the array 
for (int i = 0; i < theData.Length; i+=3) 
{ 
    //grab 3 items at a time and do db insert, continue until all items are gone. 'theData' will always be divisible by 3. 
    var a = theData[i]; 
    var b = theData[i + 1]; 
    var c = theData[i + 2]; 
} 

Tôi đã downvoted cho câu trả lời này một lần. Tôi khá chắc chắn nó liên quan đến việc sử dụng cácData.Length cho thượng nguồn. Mã như là hoạt động tốt bởi vì mảng được đảm bảo là bội số của ba trạng thái câu hỏi. Nếu bảo đảm này không đúng chỗ, bạn cần phải kiểm tra giới hạn trên với Data.Length - 2.

1

Dưới đây là một giải pháp tổng quát hơn:

int increment = 3; 
for(int i = 0; i < theData.Length; i += increment) 
{ 
    for(int j = 0; j < increment; j++) 
    { 
     if(i+j < theData.Length) { 
     //theData[i + j] for the current index 
     } 
    } 

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