2010-05-04 25 views
5

Nếu tôi nhập mã bên dưới, tôi gặp lỗi. Về cơ bản, foreach sẽ phá vỡ khi nó đi qua một điều khiển mà không phải là một nhãn.Tôi có thể sử dụng foreach để chỉ trả lại một loại nhất định từ bộ sưu tập không?

foreach (Label currControl in this.Controls()) { 

... 
} 

Tôi phải làm một việc như thế này.

foreach (Control currControl in this.Controls()) { 
    if(typeof(Label).Equals(currControl.GetType())){ 

    ... 
    } 

} 

ai cũng có thể nghĩ cách tốt hơn để làm điều đó mà không cần tôi kiểm tra loại? Tôi có thể bằng cách nào đó có được foreach để bỏ qua các đối tượng không phải là Nhãn không?

+0

Bạn có đang sử dụng .NET 3.5 không? Bạn có thể sử dụng LINQ không? – Strelok

Trả lời

10

Nếu bạn đang ở trên NET 3.5 hoặc mới hơn, bạn có thể làm một cái gì đó như thế này

foreach(var label in this.Controls().OfType<Label>()) { 
} 

OfType<T> sẽ bỏ qua loại mà không thể được đúc để T. Xem http://msdn.microsoft.com/en-us/library/bb360913.aspx

+0

cool Tôi chỉ tìm ra! bất kỳ ý tưởng nào về cách bạn sẽ thực hiện điều đó mà không có 3,5? – Diskdrive

+0

Cú pháp dễ thương: Điều này khiến tôi tự hỏi liệu tôi có thể làm điều này trong Java 6 ... –

6

Brian đã đưa ra nhiều nhất câu trả lời thích hợp theo điều khoản của OfType. Tuy nhiên, tôi muốn chỉ ra rằng có cách tốt hơn để kiểm tra các loại trong trường hợp bạn làm cần thực hiện. Thay vì mã hiện tại của bạn:

if(typeof(Label).Equals(currControl.GetType())){ 

... 
} 

Bạn có thể sử dụng:

if (currControl is Label) 
{ 
    Label label = (Label) currControl; 
    // ... 
} 

hay:

Label label = currControl as Label; 
if (label != null) 
{ 
    // ... 
} 

Lưu ý rằng cả hai lựa chọn thay thế sẽ cũng bao gồm các lớp con của Label, mà bạn mã ban đầu thì không.

+0

cảm ơn sẽ ghi nhớ điều đó – Diskdrive

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