2014-04-17 23 views
6

AM,但是偶爾串包括非整數值,這是不同的處理。字符串分割到列表<int>忽略無INT使用以下代碼的字符串分割成一個列表< int>的值

的示例串可能是這樣:1,2,3,4,X

代碼如下所示:

List<int> arrCMs = new List<int>(strMyList.Split(',').Select(x => int.Parse(x))); 

的問題,一旦是因爲它擊中的「X」則引發錯誤,因爲'x'不能被解析爲一個整數。

我怎樣才能使它忽略非整數值?我相信我應該可以用int.TryParse做些事情,但不能完全弄明白。

由於

回答

11
List<int> arrCMs = strMyList.Split(',') 
    .Select(possibleIntegerAsString => { 
     int parsedInteger = 0; 
     bool isInteger = int.TryParse(possibleIntegerAsString , out parsedInteger); 
     return new {isInteger, parsedInteger}; 
    }) 
    .Where(tryParseResult => tryParseResult.isInteger) 
    .Select(tryParseResult => tryParseResult.parsedInteger) 
    .ToList(); 

在上面的例子中的第一個Select返回一個anonymous type描述的int.TryParse結果 - 即,它是否是一個有效的整數,並且如果所以,價值是什麼。

Where子句過濾掉那些沒有有效的。

第二Select然後從能夠被解析的串檢索解析值。

+1

+1以獲得最有效的答案。 –

+2

不錯,雖然我認爲安德魯的答案稍微好一些。 –

0

更改此

int result; 
List<int> arrCMs = 
      new List<int>(strMyList.Split(',') 
            .Where(x => int.TryParse(x, out result)) 
            .Select(int.Parse)); 
+0

你忘了'out'關鍵字。 – dcastro

+0

@dcastro謝謝。當場正在做。大聲笑 –

+0

此外,將一個字符串轉換爲int將失敗。 – dcastro

0

另一個,使用Array.ForEach

List<int> ints = new List<int>(); 
Array.ForEach(strMyList.Split(','), s => 
    { 
     int i; 
     if (int.TryParse(s, out i)){ ints.Add(i);} 
    }); 
6

短和甜,使用int.TryParse

List<int> nums = list 
    .Split(',') 
    .Select(i => 
    { 
     int val; 
     return int.TryParse(i, out val) ? (int?)val : null; 
    }) 
    .Where(i => i.HasValue) 
    .Cast<int>() 
    .ToList() 

工作實施例:http://dotnetfiddle.net/4wyoAM

+1

+1當您不必使用匿名類型時。 –

-1

解析一次只爲每個值,但有點棘手。

int result = 0; 
List<int> arrCMs = strMyList.Split(',') 
          .Where(x => int.TryParse(x, out result)) 
          .Select(x => result) 
          .ToList(); 
0

劇情扭曲:使用老派foreach循環。

List<int> arrCMs = new List<int>(); 
foreach (string str in strMyList.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
{ 
    int res; 
    if (int.TryParse(str, out res)) 
    { 
     arrCMs.Add(res); 
    } 
}  

你也可以爲它創建一個方法,通過使用yield return使用迭代器塊的:

public static IEnumerable<int> ParseIntegers(string val, char seperator = ',') 
{ 
    foreach (string str in val.Split(new [] { seperator }, StringSplitOptions.RemoveEmptyEntries)) 
    { 
     int res; 
     if (int.TryParse(str, out res)) 
     { 
      yield return res; 
     } 
    } 
} 

是,如果這只是一個時間的使用可能過度工程。