2017-07-21 90 views
1

我已将逗号分隔的字符串转换为List。 列表包含空值或无效值时出现问题,如何跳过无效值?将逗号分隔的字符串转换为int列表并验证

List<int> list = model.Categories.Split(',').Select(int.Parse).ToList(); 

string将是"10,12,3.0,4,1k,5,0.0";

+0

什么是你的一个无效值?你的字符串中是否有非int值(不是空白或空格?例如只是一些随机字符串?) –

+0

是的,它将包含非int值 –

回答

3

如果你想验证只有有效的整数将达到Select使用int.TryParse

int num; 
var result = model.Categories.Split(',') 
        .Where(i => int.TryParse(i, out num)) 
        .Select(int.Parse).ToList(); 

如果使用C#7.0则可以只是:

var result = model.Categories.Split(',') 
        .Where(i => int.TryParse(i, out int num)) 
        .Select(int.Parse).ToList(); 

为了不必解析两次,你可以尝试这样的事情:

Func<string, int?> ParseOrDefault = (input) => 
    int.TryParse(input, out int num) ? (int?)num : null; 
var result = data.Split(',').Select(ParseOrDefault).Where(i => i != null).ToList(); 

或者更好:

var result = data.Split(',') 
       .Select(i => int.TryParse(i, out int num) ? (int?)num : null) 
       .Where(i => i != null).ToList(); 
+0

如果您使用CS6,则甚至不需要定义int变量,你可以使用'的TryParse(我,OUT INT NUM)'在线。 – Adwaenyth

+0

@Adwaenyth - 好评。将编辑。只是为了纠正C#7 –

+0

哎呦,我的不好。 – Adwaenyth

1

您可以尝试使用的TryParse代替Parse

List<int> list = model 
    .Categories 
    .Split(',') 
    .Select(item => { 
     int value; 
     bool parsed = int.TryParse(item, out value); 

     return new { 
     parsed = parsed, 
     value = value; 
     }; 
    }) 
    .Where(item => item.parsed) 
    .Select(item => item.value) 
    .ToList(); 
相关问题