将字符串拆分为List <int> ignore none int values </int>

时间:2014-04-17 15:51:47

标签: c# asp.net-mvc string

使用以下代码将字符串拆分为List&lt; int&gt;,但有时字符串包含非整数值,处理方式不同。

示例字符串可能类似于:1,2,3,4,x

代码如下:

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

问题是,只要它碰到了&#39; x&#39;它会引发错误,因为&#39; x&#39;不能解析为整数。

如何让它忽略非整数值?我确信我应该能够使用int.TryParse做一些事情,但无法弄明白。

由于

6 个答案:

答案 0 :(得分: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返回一个anonymous type,它描述了int.TryParse的结果 - 也就是说,它是否是一个有效的整数,如果是,那么该值是什么

Where子句筛选出那些无效的子句。

第二个Select然后从可以解析的字符串中检索解析的值。

答案 1 :(得分: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

答案 2 :(得分:0)

更改此

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

答案 3 :(得分: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);}
    });

答案 4 :(得分: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;
        }
    }
}

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

答案 5 :(得分:-1)

仅为每个值解析一次,但有点棘手。

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