2012-01-26 10 views
8

Ho questo codice per il riempimento datatable da file Excel:Skip elementi di un tipo specifico di foreach ciclo

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); 
} 

Ho problema quando la cella non è stesso tipo di dati come da tabella.

Come saltare la cella che è un tipo di dati errato?

so anche questo, ma non riesco a farlo funzionare nel mio caso:

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

risposta

8

C# è un operatore is.

Ad esempio:

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

utilizzo esplicito di 'is' non è necessario se è sufficiente digitare' foreach (string item della collezione) {. ..} '. – Nuffin

+5

No, non puoi. Avrai una InvalidCastException se qualcosa di diverso dalla stringa iterata –

4

Utilizzare l'is esercente:

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

is:

Controlla se un oggetto è compatibile con un dato tipo.

+2

Purtroppo '! Cell is MyType' non funziona, devi scriverlo come'! (Cell is MyType) '. Che è un po 'strano imo – TJHeuvel

+1

@TJHeuvel: In (casi molto rari) può essere necessario verificare se '! Cell' è un certo tipo. Inoltre mi sembra perfettamente logico (probabilmente a causa delle comuni regole di spaziatura e lunghezza delle espressioni) che '! Cell è Type' è uguale a' (! Cell) è Type' piuttosto che '! (Cell is Type)'. – Nuffin

9

È possibile utilizzare il metodo LINQ OfType<IMyType>() per filtrare gli articoli errati:

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

MSDN:

filtri gli elementi di un oggetto IEnumerable in base a un tipo specificato. Il metodo OfType (IEnumerable) restituisce solo gli elementi in source che possono essere espressi al tipo TResult

+0

'OfType ' non è necessario nei cicli 'foreach' se si specifica esplicitamente il tipo anziché dichiarare l'elemento corrente come' var'. Inoltre, per quanto ne so, il costruttore 'List ' ha un overload che accetta un 'IEnumerable '. Anche se no, potresti semplicemente scrivere 'var values ​​= items.OfType () .ToList()'. – Nuffin

+0

@Tobias: ovviamente foreach non è necessario poiché 'OfType()' elaborerà tutti gli elementi stessi – sll

+0

. Ma, se vuoi usare un foreach, puoi _can_ filtrare gli articoli per tipo semplicemente specificando esplicitamente il tipo di elemento;) – Nuffin