2011-08-16 63 views
10

Đối với trường hợp vòng lặp, tôi có thể khai báo chỉ mục bên ngoài câu lệnh for. Ví dụ, thay vìkhai báo biến ngoài vòng lặp foreach

for (int i = 0; i < 8; i++) { } 

tôi có thể làm:

int i; 
for (i = 0; i < 8; i++) { } 

Bây giờ trong so sánh với foreach vòng lặp, tôi phải khai báo các biến bên trong vòng lặp:

foreach (string name in names) { } 

Và tôi không thể làm điều gì đó như:

string name; 
foreach (name in names) { } 

Lý do điều này làm phiền tôi là sau vòng lặp, tôi muốn sử dụng biến "name" một lần nữa. Trong trường hợp vòng lặp foreach biến "name" không thể được sử dụng vì nó nằm ngoài phạm vi foreach, và tôi không thể khai báo một biến khác có cùng tên kể từ khi nó được khai báo trước đó trong cùng một phạm vi.

Bất kỳ ý tưởng nào?

+1

Bạn sẽ sử dụng tên để lặp qua danh sách, tại sao bạn cần tham khảo sau này trong mã của bạn. Tôi nghĩ bạn có thể viết mã để tránh nhu cầu sử dụng như vậy. –

+0

@Shamim Hafiz: Tôi có một trường hợp mà tôi thích một biến có cùng tên như trong vòng lặp foreach. – Naor

+0

Tôi gặp vấn đề tương tự. Tôi sử dụng một vòng lặp foreach bên trong một try-catch và tôi viết vào một bản ghi bên trong cả khối try và catch. Tôi sử dụng biến mục trong vòng lặp foreach bên trong cả hai nhật ký. Tôi đã kết thúc bằng cách sử dụng một biến thể của hai phương pháp đầu tiên của Jon Skeet. – seebiscuit

Trả lời

11

Vâng, bạn có thể làm:

string name = null; // You need to set a value in case the collection is empty 
foreach (string loopName in names) 
{ 
    name = loopName; 
    // other stuff 
} 

Hoặc nhiều khả năng:

string name = null; // You need to set a value in case the collection is empty 
foreach (string loopName in names) 
{ 
    if (someCondition.IsTrueFor(loopName) 
    { 
     name = loopName; 
     break; 
    } 
} 

Nếu nội dung của vòng lặp foreach là jus t để tìm một yếu tố phù hợp - đó có ít nhất âm thanh khả năng - sau đó bạn nên xem xét liệu LINQ sẽ là một trận đấu tốt hơn:

string name = names.Where(x => x.StartsWith("Fred")) 
        .FirstOrDefault(); 

Sử dụng LINQ thường có thể làm cho mã mà về cơ bản cố gắng tìm một cái gì đó một lot đơn giản hơn để đọc.

+0

Tìm kiếm không phải là vấn đề ở đây, nhưng bạn cung cấp giải pháp tốt. – Naor

1

Bạn không thể thực hiện việc này trong vòng lặp foreach. Bạn đang tạo và sử dụng một biến phạm vi có phạm vi được giới hạn trong truy vấn tìm kiếm.

Nếu bạn cần phải sử dụng một cái tên cá nhân từ bên trong bộ sưu tập tên sau đó bạn có thể gán nó vào một giá trị bên ngoài vòng lặp foreach:

foreach(string name in names) 
{ 
    if(name == someCondition) 
     someVariable = name; 
} 
+0

OP đề cập đến tên đó vẫn còn trên phạm vi vượt ra ngoài cơ thể của foreach, đó là sự thật? –

+1

@Shamim. Trong ví dụ của tôi, tên biến sẽ không nằm trong phạm vi bên ngoài vòng lặp foreach này. –

+0

Ah ok, tôi đoán OP là sai về việc không thể sử dụng "tên" một lần nữa. –

1

Có thể?

string name; 
foreach (var tmp in names) { name = tmp; } 
+0

Bạn đã thử chưa? điều này không hiệu quả. Nếu đó là tôi sẽ không đăng câu hỏi này. – Naor

+0

Tôi chắc chắn bạn đã bỏ lỡ điều gì đó từ đoạn trích của mình. Trên thực tế, nếu bạn kiểm tra xem nó ra, tất cả các câu trả lời ở đây cung cấp cho ít nhất là giải pháp này. Bây giờ, tôi đã bỏ lỡ bài tập null, nếu bạn muốn nitpick. – Vladimir

+0

bạn phải thay đổi nó để foreach (chuỗi tmp trong tên) nếu không nó sẽ không hoạt động. 1 cho ý tưởng. – Naor

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