2012-01-26 5 views
8

У меня есть этот код для заполнения DataTable из Ехчела:Пропустить элементы определенного типа в цикле Еогеаспа

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

У меня есть проблема, когда клетка не так же типа данных, как я установил в таблице.

Как пропустить ячейку, которая является неправильным типом данных?

Я также знаю, что это, но я не могу заставить его работать в моем случае:

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

ответ

8

C# имеет is оператора.

Например:

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

Явное использование 'is' не является необходимым, если вы просто наберите' Еогеасп (строка элемента в коллекции) {. ..} '. – Nuffin

+5

Нет, вы не можете. Вы получите InvalidCastException, если ничего, кроме строки, повторяющейся –

4

Используйте is оператора:

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

is:

проверяет, является ли объект совместим с данным типом.

+2

Ужасно '! Cell MyType' не работает, вы должны записать его как'! (Cell is MyType) '. Который является нечетным imo – TJHeuvel

+1

@TJHeuvel: В случаях (очень редких случаях) может потребоваться проверить, является ли '! Cell' определенным типом. Также мне кажется вполне логичным (возможно, из-за общих правил интервала и длины выражения), что '! Cell is Type' равно' (! Cell) - это Type', а не '! (Cell is Type)'. – Nuffin

9

Вы можете использовать LINQ OfType<IMyType>() метод, чтобы отфильтровать неправильные детали:

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

MSDN:

Фильтры элементов в IEnumerable на основе указанного типа. Метод OfType (IEnumerable) возвращает только те элементы источника, который может быть приведен к типу TResult

+0

'OfType ' не нужно в циклах foreach, если вы явно укажете тип вместо объявления текущего элемента как 'var'. Кроме того, насколько мне известно, конструктор 'List ' имеет перегрузку, которая принимает «IEnumerable ». Даже если нет, вы можете просто написать «var values ​​= items.OfType () .ToList()'. – Nuffin

+0

@Tobias: очевидно, foreach не требуется, так как 'OfType()' будет обрабатывать все элементы самостоятельно – sll

+0

Действительно. Но _if_ вы хотите использовать foreach, вы можете фильтровать элементы по типу, просто указав тип элемента явно;) – Nuffin

Смежные вопросы