2016-05-13 3 views
1

У меня есть несколько идентификаторов в List<string>()экстракт целого числа от конца строки

List<string> IDList = new List<string>() { 
"ID101",  //101 
"I2D102", //102 
"103",  //103 
"I124D104", //104 
"ID-105", //105 
"-1006" }; //1006 

Правила: Строка всегда заканчивается с идентификатором, который имеет длину от 1 до п и является int только

мне нужна для извлечения их до значений int. Но мое решение не работает

List<int> intList = IDList.Select(x => int.Parse(Regex.Match(x, @".*\d*").Value)).ToList(); 
+1

«мое решение не работает», что она делает, что вы не ожидаете? Что вы пытаетесь восстановить? последние цифры? – Sayse

+0

Вы хотите * игнорировать * знак минус? Например. должен ли '' -1006'' быть преобразован в '1006'? –

+0

Является ли идентификатор всегда в конце? – Ian

ответ

2

Вот другой подход LINQ, который работает, если число всегда на конечные и отрицательные значения невозможны. Пропускает недопустимые строки:

List<int> intList = IDList 
    .Select(s => s.Reverse().TakeWhile(Char.IsDigit)) 
    .Where(digits => digits.Any()) 
    .Select(digits => int.Parse(String.Concat(digits.Reverse()))) 
    .ToList(); 

(Edit: похожие на Ian's approach)

1

Это ниже фрагмента кода последнего идентификатора в виде целого числа из коллекции и игнорировать их, заканчивающийся ни целого значение

List<int> intList = IDList.Where(a => Regex.IsMatch(a, @"\d+$") == true) 
    .Select(x => int.Parse(Regex.Match(x, @"\d+$").Value)).ToList(); 
+2

Есть ли способ предотвратить исключение в случае недопустимого id? например «abc» игнорировать это в списке результатов? –

+0

да, вы можете игнорировать их, используя мой обновленный код, если конечное значение не является допустимым int, а затем игнорирует их, попробуйте мое последнее обновление – Mostafiz

-2

я предполагаю, что вы хотите, чтобы последние номера:

var res = IDList.Select(x => int.Parse(Regex.Match(x, @"\d+$").Value)).ToList(); 
+2

, что отличает мое решение? – Mostafiz

+0

Это всего лишь копия вышеупомянутого решения. – Venky

+0

Извините, когда я отправляю свое решение, вы уже отправляете сообщение. я должен был сделать F5 до посты. – BrunoA

3

Если ID всегда в конце концов, вы могли бы использовать LINQ решение вместо Regex:

var query = IDList.Select(id => 
    int.Parse(new string(id.Reverse() 
     .TakeWhile(x => char.IsNumber(x)) 
     .Reverse().ToArray()))); 

Идея состоит в том, чтобы взять персонажей из последних, пока не найдет номер. Что бы вы ни получили, вы конвертируете его в int. Хорошая вещь об этом решении - это действительно то, что вы указываете.

3

Ну, по

Правило: Строка всегда заканчивается с идентификатором, который имеет длину от 1 до п и является ИНТ только

картина не что иное, как

[0-9]{1,n}$ 

    [0-9] - ints only 
    {1,n} - from 1 to n (both 1 and n are included) 
    $  - string always ends with 

и возможная реализация может быть примерно такой

int n = 5; //TODO: put actual value 
    String pattern = "[0-9]{1," + n.ToString() + "}$"; 

    List<int> intList = IDList 
    .Select(line => int.Parse(Regex.Match(line, pattern).Value)) 
    .ToList(); 

В случае вы некоторые ломаные, скажем "abc" (и вы хотите фильтровать их):

List<int> intList = IDList 
    .Select(line => Regex.Match(line, pattern)) 
    .Where(match => match.Success) 
    .Select(match => int.Parse(match.Value)) 
    .ToList(); 
+0

@berkser: спасибо! Я отредактировал опечатку –

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