2016-05-13 49 views
1

我有一個List<string>()提取整數

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

規則多個ID:字符串總是與具有長度爲1至n和是int

我所需要的ID結束將它們提取到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(); 

(編輯:類似Ian's approach

1

這下面的代碼提取最後一個ID爲整數,而忽略他們,我想,你希望最後的數字,其一端與沒有整數值

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到n和 爲int的ID結束僅

圖案只不過是

[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(); 

萬一裏有一些虛線,說​​(你想篩選出來):

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

@berkser:謝謝!我編輯了錯字 –