2012-01-26 16 views
8

Mam ten kod do wypełniania DataTable z pliku Excel:Omiń elementy określonego typu w pętli foreach

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

Mam problem, gdy komórka nie jest taki sam typ danych jak ustawić w tabeli.

Jak pominąć komórkę, która jest niewłaściwym typem danych?

ja też to wiem, ale nie mogę zrobić to działa w moim przypadku:

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

Odpowiedz

8

C# ma operatora is.

Na przykład

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

Explicit użycie 'is' nie jest konieczne, jeśli wystarczy wpisać' foreach (element ciągu w kolekcji) {. ..} '. – Nuffin

+5

Nie, nie możesz. Dostaniesz InvalidCastException, jeśli cokolwiek innego niż ciąg iterowane –

4

pomocą operatora is:

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

is:

sprawdza, czy obiekt jest kompatybilny z danego typu.

+2

Niestety '! Cell is MyType' doesnt work, musisz napisać go jako'! (Komórka to MyType) '. Które jest trochę dziwne imo – TJHeuvel

+1

@ TJHeuvel: W przypadkach (bardzo rzadko imo) może być konieczne sprawdzenie, czy '! Cell' jest określonym typem. Również wydaje mi się to logiczne (prawdopodobnie z powodu wspólnych reguł odstępów i długości części wyrażeniowych), że '! Cell is Type' jest równe' (! Cell) is Type' zamiast '! (Cell is Type)'. – Nuffin

9

Można użyć LINQ OfType<IMyType>() sposób odfiltrować błędne pozycje:

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

MSDN:

Filtruje elementy IEnumerable na podstawie określonego typu. OfType metoda (IEnumerable) zwraca tylko te elementy źródła, które mogą być oddane do wpisywania TResult

+0

'OfType ' jest niepotrzebne w pętlach 'foreach', jeśli jawnie określisz typ, zamiast deklarować bieżący element jako' var'. Ponadto, o ile mi wiadomo, konstruktor 'List ' ma przeciążenie, które akceptuje 'IEnumerable '. Nawet jeśli nie, możesz po prostu napisać 'var values ​​= items.OfType () .ToList()'. – Nuffin

+0

@Tobias: oczywiście foreach nie jest wymagana, ponieważ 'OfType()' przetworzy wszystkie same elementy. – sll

+0

Rzeczywiście. Ale _if_ chcesz użyć foreach, możesz _ filtrować elementy według typu, po prostu określając typ elementu jawnie;) – Nuffin