2013-09-30 216 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

@Douglas:答案中明確提到了這一點;我已經添加了一個鏈接到文檔。 – Jon

+0

是的,我總結了人們可能會遇到的主要差異。另一方面,如果全數字假設對於OP的數據有效,那麼這種方法可能比'int.TryParse'更有效。 – Douglas

3

TryParse方法int是最可靠的指標,你有一個合適的數字。

使用方法如下:

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); 
相關問題