2013-09-30 3 views

ответ

10

Вы можете фильтровать данные на основе значения, возвращаемого Int32.TryParse метода:

int temp; 
list.Where(x => int.TryParse(x, out temp)); 
+0

Поведение значения 'temp' недокументированная деталь реализации и может изменяться в будущем. Вместо этого я предпочитаю [расширение] (http://stackoverflow.com/a/19091443/284240). –

+1

@TimSchmelter: Действительная точка. Однако вышеприведенное решение остается верным, если конечное значение «temp» не используется последующим кодом. Можно было бы приложить приведенный выше фрагмент кода в выделенном блоке оператора, чтобы обеспечить его выполнение. – Douglas

6

Фильтр список вниз только те строки все символы из которых являются цифры:

var filtered = list.Where(s => s.All(char.IsDigit)); 

Альтернативным заключается в использовании int.TryParse в качестве функции фильтрации, которая имеет ряд тонких различий в поведении (правила для того, что действительное целое число позволяет больше, чем просто цифры, см. в разделе documentation).

Если вы хотите, чтобы результаты были напечатаны как целые числа, выполните следующие действия: .Select(int.Parse).

+4

Это пропустит отрицательные значения и целые числа с ведущим или конечным пробелом. – Douglas

+0

@ Дуглас: В ответ есть явное упоминание об этом; Я добавил ссылку на документы. – Jon

+0

Да, я обобщал основные различия, которые можно было бы встретить. С другой стороны, этот подход, вероятно, будет более эффективным, чем 'int.TryParse', если всезначное предположение действительно для данных OP. – Douglas

3

Метод TryParseint является самым надежным индикатором того, что у вас есть правильный номер.

Используйте это так:

int number = 0; 
var selected = list.Where(x => int.TryParse(x, out number)).ToList(); 
5

Один из способов:

IEnumerable<int> ints = strings.Where(str => str.All(Char.IsDigit)) 
    .Select(str => int.Parse(str)); 

Это выбирает только строки, где все символы являются цифры. Затем он анализирует их на int.

Лучший способ заключается в использовании этого расширения:

public static int? TryGetInt(this string item) 
{ 
    int i; 
    bool success = int.TryParse(item, out i); 
    return success ? (int?)i : (int?)null; 
} 

Затем вы можете использовать этот запрос:

IEnumerable<int> ints = strings.Select(str => str.TryGetInt()) 
    .Where(nullableInt => nullableInt.HasValue) 
    .Select(nullableInt => nullableInt.Value); 
Смежные вопросы