2012-01-26 34 views
8

Tôi có mã này cho điền DataTable từ file excel:Bỏ qua mục của một loại hình cụ thể trong foreach vòng lặp

for (int rowIndex = cells.FirstRowIndex; rowIndex <= cells.LastRowIndex; rowIndex++) 
{ 
    var values = new List<string>(); 
    foreach (var cell in cells.GetRow(rowIndex)) 
    { 
     values.Add(cell.Value.StringValue); 
    } 
    dataTable.LoadDataRow(values.ToArray(), true); 
} 

Tôi có vấn đề khi tế bào không phải là cùng một kiểu dữ liệu như tôi thiết lập trong bảng.

Cách bỏ qua ô không đúng kiểu dữ liệu?

Tôi cũng biết điều này, nhưng tôi không thể làm cho nó làm việc trong trường hợp của tôi:

foreach //... 
{ 
    if //if datatype is not right 
    { 
     continue; 
    } 
} 

Trả lời

8

C# có một nhà điều hành is.

Ví dụ:

foreach(var item in collection) 
{ 
if(item is string) 
{ 
    //Do something with the string. 
} 
} 
+0

sử dụng Explicit của 'is' là không cần thiết nếu bạn chỉ cần gõ' foreach (string mục trong bộ sưu tập) {. ..} '. – Nuffin

+5

Không, bạn không thể. Bạn sẽ có một InvalidCastException nếu bất cứ điều gì khác hơn là chuỗi lặp đi lặp lại –

4

Sử dụng is điều hành:

if(cell is MyType) 
{ 
    // can work 
} 

is:

Kiểm tra nếu một đối tượng là tương thích với một loại nhất định.

+2

Đáng buồn '! Ô là MyType' không hoạt động, bạn phải viết nó là'! (Ô là MyType) '. Đó là kinda lẻ imo – TJHeuvel

+1

@TJHeuvel: Trong (rất hiếm imo) trường hợp nó có thể là cần thiết để kiểm tra xem '! Cell' là một loại nhất định. Ngoài ra nó có vẻ hoàn toàn hợp lý với tôi (có thể vì các quy tắc khoảng cách chung và chiều dài phần biểu thức) mà '! Cell is Type' bằng' (! Cell) là Type' thay vì '! (Ô là Kiểu)'. – Nuffin

9

Bạn có thể sử dụng phương pháp LINQ OfType<IMyType>() để lọc ra các mặt hàng sai:

// do not forget adding using System.Linq; 
var filteredItems = items.OfType<IMyType>(); 
var values = new List<IMyType>(filteredItems); 

MSDN:

lọc các yếu tố của một IEnumerable dựa trên một loại quy định. Các OfType phương pháp (IEnumerable) chỉ trả về những yếu tố trong nguồn có thể được đúc để gõ TResult

+0

'OfType ' là không cần thiết trong vòng lặp foreach' nếu bạn chỉ định kiểu rõ ràng thay vì khai báo mục hiện tại là 'var'. Ngoài ra, theo như tôi biết, hàm tạo 'List ' có quá tải chấp nhận một 'IEnumerable '. Thậm chí nếu không, bạn chỉ có thể viết 'var values ​​= items.OfType () .ToList()'. – Nuffin

+0

@Tobias: rõ ràng foreach là không cần thiết vì 'OfType()' sẽ xử lý tất cả các mục riêng của mình – sll

+0

Thật vậy. Nhưng _if_ bạn muốn sử dụng một foreach, bạn _can_ lọc các mục theo loại chỉ bằng cách xác định loại mục một cách rõ ràng;) – Nuffin

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