将字符串拆分为List<int>,忽略非整数值

7

我使用以下代码将字符串拆分为List<int>,但有时字符串包含非整数值,这些值会被不同处理。

例如,字符串可能是这样的:1,2,3,4,x

代码如下:

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

问题是一旦它遇到 'x',就会抛出错误,因为 'x' 无法解析为整数。
我该如何使其忽略非整数值?我确定我应该能够使用int.TryParse做些什么,但无法完全弄清楚。
谢谢
6个回答

12
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返回一个匿名类型,描述了int.TryParse的结果-即是否为有效整数,如果是,则值是多少。

Where子句过滤掉那些不合法的值。

第二个Select然后从能够被解析的字符串中检索解析出的值。


2
不错,但我认为安德鲁的回答更好一些。 - Gary McGill

7

简单明了,使用 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()

Working Example: http://dotnetfiddle.net/4wyoAM


1
如果不必要,尽量避免使用匿名类型。 - Henk Mollema

0

更改这个

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

你忘记了 out 关键字。 - dcastro
此外,将字符串转换为整数将失败。 - dcastro
不错的解决方案,但由于你最终需要解析两次,所以性能较差。 - Etienne Maheu

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);}
    });

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;
        }
    }
}

如果只是一次性使用,这可能是过度工程。


-1

每个值只需解析一次,但有点棘手。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接